首页 > a different object with the same identifier val...

a different object with the same identifier val...

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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 疑难异常及处理





1、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里面自带的方法,推荐使用。



2、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();

  }

  }



转载于:https://my.oschina.net/u/617245/blog/71885

更多相关:

  • 声明:本文为转载,如果有侵犯知识版本,请通知本人,本人将即刻停止侵权行为: http://blog.csdn.net/tianlesoftware/article/details/7412555 Oracle存储过程无法编译,在PL/SQL中编译,总是挂住了,这个原因可能是要编译的对象被会话给锁住了: 1、查看无效对象: 1 SEL...

  • from sqlalchemy import create_engine from sqlalchemy.orm import scoped_session, sessionmaker from setting import EREBUS_DB_CONNECT_STRING from contextlib import conte...

  • 设置 session_id()程序恢复sess...

  • Session又称为会话状态,是Web系统中最常用的状态,用于维护和当前浏览器实例相关的一些信息。举个例子来说,我们可以把已登录用户的用户名放在Session中,这样就能通过判断Session中的某个Key来判断用户是否登录,如果登录的话用户名又是多少。 我们知 道,Session对于每一个客户端(或者说浏览器实例)是“人手一份”...

  • /*js中遍历对象属性*/ function printObject(obj) {var temp = "";for (var key in obj) {temp += key + ":" + obj[key] + " ";}return temp; }/*测试用例*/ var obj = {"a": "1", "b": "2"};...

  •     /* @flow */ // Object.freeze 使得这个对象不能增加属性, 修改属性, 这样就保证了这个对象在任何时候都是空的 export const emptyObject = Object.freeze({}) /*** Check if a string starts with $ or _ ascii u...

  • 当使用jquery1.3以上版本时,进行ajax参数传值时,会出现以下的一个错误:  ognl.ExpressionSyntaxException: Malformed OGNL expression: f[] [ognl.ParseException: Encountered " "]" "] "" at line 1, col...

  • 在IssueVision的命令模式中有如下代码(PatternsCommander.cs)  public static void Connect(ToolBarButton button, Command command)  {   ToolBarButtonCommander unused = new ToolBarButto...