a different object with the same identifier val...

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();   }   }
相关文章
相关标签/搜索