开发中遇到的hibernate异常:a different object with the same identifier value was already associated with the session
2012-05-23 10:53
489 查看
异常:
org.springframework.orm.hibernate3.HibernateSystemException: a different object with the same identifier value was already associated with the session:
日志节选:
2012-05-16 16:55:51,354[CatchExceptionFilter.java:88 :ERROR] CatchExceptionFilter捕获到异常...
org.springframework.orm.hibernate3.HibernateSystemException: a different object with the same identifier value was already associated with the session: [cn.ac.iscas.core.entity.pm.cm.CmPlanBaseline#587]; nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [cn.ac.iscas.core.entity.pm.cm.CmPlanBaseline#587]
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:679)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdate(HibernateTemplate.java:737)
at cn.ac.intec.entity.orm.impl.SessionImpl.saveOrUpdate(SessionImpl.java:133)
at cn.ac.intec.entity.orm.impl.SessionImpl.insertOrUpdate(SessionImpl.java:125)
at cn.ac.intec.entity.orm.impl.SessionImpl$$FastClassByCGLIB$$550f49cd.invoke(<generated>)
触发场景,解决方案:
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里的持久化实体,然后杀掉,再保存临时实体。没问题了。
org.springframework.orm.hibernate3.HibernateSystemException: a different object with the same identifier value was already associated with the session:
日志节选:
2012-05-16 16:55:51,354[CatchExceptionFilter.java:88 :ERROR] CatchExceptionFilter捕获到异常...
org.springframework.orm.hibernate3.HibernateSystemException: a different object with the same identifier value was already associated with the session: [cn.ac.iscas.core.entity.pm.cm.CmPlanBaseline#587]; nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [cn.ac.iscas.core.entity.pm.cm.CmPlanBaseline#587]
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:679)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdate(HibernateTemplate.java:737)
at cn.ac.intec.entity.orm.impl.SessionImpl.saveOrUpdate(SessionImpl.java:133)
at cn.ac.intec.entity.orm.impl.SessionImpl.insertOrUpdate(SessionImpl.java:125)
at cn.ac.intec.entity.orm.impl.SessionImpl$$FastClassByCGLIB$$550f49cd.invoke(<generated>)
触发场景,解决方案:
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里的持久化实体,然后杀掉,再保存临时实体。没问题了。
相关文章推荐
- 开发中遇到的hibernate异常:a different object with the same identifier value was already associated with the
- a different object with the same identifier value was already associated withthe session异常解决方案
- a different object with the same identifier value was already associated withthe session异常解决方案
- Hibernate更新数据报错:a different object with the same identifier value was already associated with the session: [com.elec.domain.ElecCommonMsg#297e35035c28c368015c28c3e6780001]
- hibernate异常:a different object with the same identifier value was already associated
- hibernate:a different object with the same identifier value was already associated with the session
- 异常a different object with the same identifier value was already associated with the session
- hibernate a different object with the same identifier value was already associated with the session
- hibernate中一种导致a different object with the same identifier value was already associated with the session错误方式及解决方法
- Hibernate :A different object with the same identifier value was already associated with the session
- 解决hibernate: a different object with the same identifier value was already associated with the session 错误
- hibernate a different object with the same identifier value was already associated with the session
- a different object with the same identifier value was already associated with the session 一个经典的hibernate错误
- a different object with the same identifier value was already associated with the session异常解决办法
- HibernateSystemException: a different object with the same identifier value was already associated with the session.
- a different object with the same identifier value was already associated withthe session异常解决方案
- Hibernate:a different object with the same identifier value was already associated with the session
- a different object with the same identifier value was already associated withthe session异常解决方案
- Hibernate Error: a different object with the same identifier value was already associated with the session
- Hibernate:a different object with the same identifier value was already associated wit异常解决