开发中遇到的hibernate异常:a different object with the same identifier value was already associated with the

来源:互联网 发布:java图形用户界面 编辑:程序博客网 时间:2024/06/06 18:30
异常:
org.springframework.orm.hibernate3.HibernateSystemException: a different object with the same identifier value was already associated with the session:

日志节选:

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [entity.Dept#42]at org.hibernate.engine.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:638)at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:120)at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:73)at org.hibernate.impl.SessionImpl.fireDelete(SessionImpl.java:956)at org.hibernate.impl.SessionImpl.delete(SessionImpl.java:934)at dao.BasicDaoImpl.delBasic(BasicDaoImpl.java:34)at action.DeptAction.delDept(DeptAction.java:32)

触发场景,解决方案:

         1. show业务操作,开启一个session ,从中查出一些实体,这时某个实体是存在于session中的持久化对象。通过业务逻辑将此实体用于页面展示。此时这个session并未关闭。

         2. 这时执行一步save业务逻辑,将上一步获得的实体id传回后台 。这时通过new的方式创建了一个 临时对象,并且我将 传回的id作为主键付给了临时对象。然后调用了session.save(obj); 方法 。。。抛出异常。

原因很简单,session中有2个oid一样的对象,hibernate不知道该让哪个持久化到库里。当时解决思路也很清晰,直接 clear();清空一下 session缓存不就Ok了。但是 clear打击面太广了(慎用!)。其他一些“无辜”对象也被杀掉,导致其他业务无法进行了。

后来在session中发现一个evict方法,“定点清除”对象缓存。这下就好了,先用传回来的id用get方法(其实这里用load方法也行反正都是从缓存中加载)获得session里的持久化实体,然后杀掉,再保存临时实体。没问题了。


阅读全文
0 0
原创粉丝点击