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 xxxx
hibernate3.0以上使用merge()来合并两个session中的同一对象
具体到我本身的代码就是
public Object getDomain(Object obj) {
getHibernateTemplate().refresh(obj);
return obj;
}
public void deleteDomain(Object obj) {
obj = getHibernateTemplate().merge(obj);
getHibernateTemplate().delete(obj);
}
解决a different object with the same identifier value was already associated with the session错误
这个错误我一共遇到过两次,一直没有找到很好的解决方案,这个错误产生缘由相信你们都知道,由于在hibernate中同一个session里面有了两个相同标识可是是不一样实体,当这时运行saveOrUpdate(object)操做的时候就会报这个错误。呵呵,也许你会说,你这么说跟没说没什么区别,我认可,呵呵,我不知道具体为何会产生这个错误,要否则也不会好久都没有解决,如今,给出一个临时的解决方案,给向我同样,没有办法找到根源的人一个可以继续执行下去的方法(固然是对的,只是否是从产生缘由入手)
其实要解决这个问题很简单,只须要进行session.clean()操做就能够解决了,可是你在clean操做后面又进行了saveOrUpdate(object)操做,有可能会报出"Found two representations of same collection",我找了不少资料,没有什么很好的解释,其中这篇文章帮助最大[url]http://opensource.atlassian.com/projects/hibernate/browse/HHH-509[/url]。
最后经过session.refresh(object)方法就能够解决了,注意,当object不是数据库中已有数据的对象的时候,不能使用session.refresh(object)由于refresh是从hibernate的session中去从新取object,若是session中没有这个对象,则会报错因此当你使用saveOrUpdate(object)以前还须要判断一下
固然这个问题最容易解决的办法仍是使用Hibernate里面自带的merge()方法。不过我始终以为碰到问题就用这种软件自带的很是用方法(和saveOrUpdate(),save(),update()相比)感受十分不爽。
后来我还发现这种错误常常出如今一对多映射和多对多映射,请你们在使用一对多和多对多映射的时候要当心一些
Hibernate 疑难异常及处理
一、a different object with the same identifier value was already associated with the session。
错误缘由:在hibernate中同一个session里面有了两个相同标识可是是不一样实体。
解决方法一:session.clean()
PS:若是在clean操做后面又进行了saveOrUpdate(object)等改变数据状态的操做,有可能会报出"Found two representations of same collection"异常。
解决方法二:session.refresh(object)
PS:当object不是数据库中已有数据的对象的时候,不能使用session.refresh(object)由于该方法是从hibernate的session中去从新取object,若是session中没有这个对象,则会报错因此当你使用saveOrUpdate(object)以前还须要判断一下。
解决方法三:session.merge(object)
PS:Hibernate里面自带的方法,推荐使用。
二、Found two representations of same collection
错误缘由:见1。
解决方法:session.merge(object)
以上两中异常常常出如今一对多映射和多对多映射中
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 xxxx
hibernate3.0以上使用merge()来合并两个session中的同一对象
具体到我本身的代码就是
public Object getDomain(Object obj) {
getHibernateTemplate().refresh(obj);
return obj;
}
public void deleteDomain(Object obj) {
obj = getHibernateTemplate().merge(obj);
getHibernateTemplate().delete(obj);
}
====================我是分割线===================
其实个人解决办法是把obj给从新merge一下,注意红字部分
public Serializable save(Object persistentObject) throws DaoException {
try {
Session session = this.openSession();
beginTransaction();
persistentObject = session.merge(persistentObject); Serializable id = session.save(persistentObject); if (autoCommit) commitTransaction(); return id; } catch (HibernateException ex) { log.error("Fail to save persistentObject", ex); throw new DaoException("Fail to save persistentObject", ex); } finally { if (autoCloseSession) closeSession(); } }