NHibernate中session.update()及session.merge()的区别
今天的工作中遇到一个奇怪的问题,如下:
"a different object with the same identifier value was already associated with the session: 19519146"
该异常的上下文如下:
1:在net.tcp绑定的wcf远程调用时产生;
2:通过UI调用方法不会产生该异常。
分析该问题:
由异常信息可以看出,该问题是由于在session.update对一组实体进行更新后,试图将新的实体associate到session(19519146)失败导致的,因为该session下已经有相同identifier的实体存在。
同时,查阅session.update的说明:
update(Object entity)
Update the given persistent instance, associating it with the current Hibernate Session.
由此可知,确实是由于update产生了这个问题(为什么会产生这个问题不太清楚,有人知道请不吝告知)。
解决方案:
查阅session提供的持久化方法:
Object merge(Object entity)
Copy the state of the given object onto the persistent object with the same identifier.
在merge接口的定义中可看出,该接口是将给定的实体,拷贝到session下对应的已持久化实体(不知道该理解是否正确)。
因此,通过调用merge()方法,可以避免这个异常。
PS:
通过查阅资料,session.evict()接口,可将持久化实体从session的缓存中清除,在该问题的上下文中,通过先调用该方法,清除原已持久化实体,再进行update(),也不会产生重复associating的异常。
也可以通过清理session关联实体对象(session.clear())来解决问题。
NHibernate中session.update()及session.merge()的区别的更多相关文章
- unity3D脚本中,update ,fixupdate 和lateupdate的区别
1.MonoBehaviour.Update 更新 当MonoBehaviour启用时,其Update在每一帧被调用. 2.MonoBehaviour.FixedUpdate 固定更新 当MonoBe ...
- 第二节 hibernate session介绍以及session常用方法介绍
原创地址:http://www.cnblogs.com/binyulan/p/5628579.html Session是java应用程序和hibernate框架之间的一个主要接口.它是从持久化服务中剥 ...
- 关于NHibernate中存在于Session中实例的3种状态的简单分析
在使用NHibernate的时候.在Session中会有3种状态. 1. 瞬时状态 (Transient) 由 new 命令开辟内存空间的对象,也就是平时所熟悉的普通对象. 如: Student st ...
- NHibernate中Session的处理 线程不安全
NHibernate中Session是线程不安全的,而且每次数据库操作 请求创建Session时对性能有些影响.在Windows应用中可以通过 [ThreadStatic]特性很简单的就可以实现线程安 ...
- 程序中的Cookie 和Session
这几天回家休息后,想想放假之前的几天,主要看的一些工作上的东西,发现对Session和Cookie这两个东西,我还是很陌生.恩,趁着有网,看了点相关的资料,打算整理下.一翻博客,发现已经有前辈已经对这 ...
- SqlAlchemy 中操作数据库时session和scoped_session的区别(源码分析)
原生session: from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from sqlalch ...
- SpringMVC+Hibernate 使用 session.update(obj) 未更新的问题
1.使用spring控制事务 2.使用session.update(obj)执行更新 spring事务配置: <bean id="transactionBese" class ...
- C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?
C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...
- flask 源码专题(五):SqlAlchemy 中操作数据库时session和scoped_session的区别
1原生session: from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from sqlalc ...
随机推荐
- python 使用pip安装第三方模块
part 1:使用方法: 1.pip install somePackage picture 1 2.pip show somePackage 例如:pip show pip 弹出关于该模块的信息 p ...
- 查找代码错误.java
class Other{ public int i; } class Something{ public static oivd main(String[]args){ Other o = new O ...
- AC日记——潜伏着 openjudge 1.7 11
11:潜伏者 总时间限制: 1000ms 内存限制: 65536kB 描述 R国和S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动. 历经艰险后,潜伏于S国的R国间谍小C终于摸清了S国军 ...
- HQL基础查询语句
HQL基础查询语句 1.使用hql语句检索出Student表中的所有列 //核心代码 @Test public void oneTest() { Query query=session.createQ ...
- windows下 git配置ssh
1. 打开 git bash 2. cd ~/.ssh 3. ssh-genkey (一致next), 会生成 id_rsa (密钥); id_rsa.pub(公钥) 4. 用记事本打开 id_rs ...
- javascript动态创建script标签,加载完成后调用回调
代码如下: var head = document.getElementsByTagName('head')[0]; var script = document.createElement('scri ...
- WPF 4.0 DatePicker 快速录入
WPF 4.0的DatePicker在通过键盘录入日期的时候是非常让人郁闷的.必须按照日期的格式来完整输入例如,比如输入“2010/10/10”才能识别.而实际上在一些要求快速录入的场合,用户更希望直 ...
- [LINK]php的三种CLI常量:STDIN,STDOUT,STDERR
FROM : http://www.cnblogs.com/thinksasa/archive/2013/02/27/2935158.html PHP CLI(command line interfa ...
- tcpip的可靠性
- QT 常用控件二
QT提供QHBoxLayout类.QVBoxlayout类及QGridLayout类等的基本布局管理,分别是水平排列布局,垂直排列布局和网格排列布局 addWidget()方法用于向布局中加入需要布局 ...