码迷,mamicode.com
首页 > Web开发 > 详细

NHibernate中session.update()及session.merge()的区别

时间:2015-06-09 23:36:09      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:

今天的工作中遇到一个奇怪的问题,如下:

"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的异常。

 

 

NHibernate中session.update()及session.merge()的区别

标签:

原文地址:http://www.cnblogs.com/JiaK/p/4564700.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!