a different object with the same identifier value was already associated with the session
2015-12-15 17:46
615 查看
这个文章的方案符合我的要求,记录在此:
触发场景,解决方案:
1. show业务操作,开启一个session ,从中查出一些实体,这时某个实体是存在于session中的持久化对象。通过业务逻辑将此实体用于页面展示。此时这个session并未关闭。
2. 这时执行一步save业务逻辑,将上一步获得的实体id传回后台 。这时通过new的方式创建了一个临时对象,并且我将传回的id作为主键赋值给了临时对象。然后调用了session.save(obj); 方法 。。。抛出异常。
原因很简单,session中有2个oid一样的对象,hibernate不知道该让哪个持久化到库里。当时解决思路也很清晰,直接clear();清空一下 session缓存不就Ok了。但是clear打击面太广了(慎用!)。其他一些“无辜”对象也被杀掉,导致其他业务无法进行了。
后来在session中发现一个evict方法,“定点清除”对象缓存。这下就好了,先用传回来的id用其实这里用load方法也行反正都是从缓存中加载)获得session里的持久化实体,然后杀掉,再保存临时实体。没问题了。
原文地址:/article/4621322.html
由于我的session是封装的,本身没有get,evict方法,所以先调用出被他封装的session,而后就能使用这两个方法了.
HBSession sess = HBUtil.getHBSession();
Query queryUser = sess.createQuery(From User where name=:name);
queryUser.setString("name","测试人员");
List<User> UserList = queryUser.list();
...
...
...//这里是使用的过程
//接下来进行清理
for(int i=0;i<UserList.size();i++){
//sess.getSession()是获取被封装的session,因为我的sess本身没有get(xxxx,xxx),evict(Object) 方法
//自行百度session.get方法的使用方式
Object tempUser= sess.getSession().get(User.class, UserList.get(i).getKey());
//把取到的对象从sess缓存中清理出去
sess.getSession().evict(tempUser);
}
触发场景,解决方案:
1. show业务操作,开启一个session ,从中查出一些实体,这时某个实体是存在于session中的持久化对象。通过业务逻辑将此实体用于页面展示。此时这个session并未关闭。
2. 这时执行一步save业务逻辑,将上一步获得的实体id传回后台 。这时通过new的方式创建了一个临时对象,并且我将传回的id作为主键赋值给了临时对象。然后调用了session.save(obj); 方法 。。。抛出异常。
原因很简单,session中有2个oid一样的对象,hibernate不知道该让哪个持久化到库里。当时解决思路也很清晰,直接clear();清空一下 session缓存不就Ok了。但是clear打击面太广了(慎用!)。其他一些“无辜”对象也被杀掉,导致其他业务无法进行了。
后来在session中发现一个evict方法,“定点清除”对象缓存。这下就好了,先用传回来的id用其实这里用load方法也行反正都是从缓存中加载)获得session里的持久化实体,然后杀掉,再保存临时实体。没问题了。
原文地址:/article/4621322.html
由于我的session是封装的,本身没有get,evict方法,所以先调用出被他封装的session,而后就能使用这两个方法了.
HBSession sess = HBUtil.getHBSession();
Query queryUser = sess.createQuery(From User where name=:name);
queryUser.setString("name","测试人员");
List<User> UserList = queryUser.list();
...
...
...//这里是使用的过程
//接下来进行清理
for(int i=0;i<UserList.size();i++){
//sess.getSession()是获取被封装的session,因为我的sess本身没有get(xxxx,xxx),evict(Object) 方法
//自行百度session.get方法的使用方式
Object tempUser= sess.getSession().get(User.class, UserList.get(i).getKey());
//把取到的对象从sess缓存中清理出去
sess.getSession().evict(tempUser);
}
相关文章推荐
- Object类
- for,for-in和enumerateObjectsUsingBlock的比较
- python 安装pandas 出现InsecurePlatformWarning: A true SSLContext object is not available.
- Objective-c语言_复合
- 显示所有数据库 mysql_fetch_object()
- Objective-c语言_对可变数组NSMutableArray
- Objective-c语言_对不可变数组NSArray
- java泛型与object的比较
- difference between string literal and string object
- Swift学习: 从Objective-C到Swift
- objective-C 数组二 "可变数组"
- Objective-C语言——NSMutableArray可变数组
- Objective-C语言——NSAarray不可变数组
- postgresql报错Error while loading shared libraries: libpq.so.5: cannot open shared object file
- 单 例(Singleton)
- Xcode升级到7系列后 缺少 *.dylib库的解决方法
- FileReader createObjectURL
- [转]PDF预览插件PDFObject.js
- error while loading shared libraries: libreadline.so.5: cannot open shared object file
- 在IE中使用ActiveX控件,需要使用HTML中的标志是<OBJECT>,该标记几个重要的参数特性有: