博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
a different object with the same identifier value was already associated with the session
阅读量:6587 次
发布时间:2019-06-24

本文共 9150 字,大约阅读时间需要 30 分钟。

这个问题,我把对象赋值为NULL,也是很好用的.在我的系统中,更新好用了,可是插入不好用了.没改前,是插入好用,而更新不好用.本来是系统中的问题,可是,catch只是捕捉到,从但是,没有把log打印出来,找原因实在是难找.在高度数据库时,最好把异常捕捉中的信息打印出来.org.springframework.orm.hibernate.HibernateSystemException: a different object with the same identifier value was already associated with the session: 4443398, of class: com.onewaveinc.media.cms.entity.SyncImportFolder; nested exception is net.sf.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: 4443398, of class: com.onewaveinc.media.cms.entity.SyncImportFolder

net.sf.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: 4443398, of class: com.onewaveinc.media.cms.entity.SyncImportFolder

at net.sf.hibernate.impl.SessionImpl.doSave(SessionImpl.java:852)

at net.sf.hibernate.impl.SessionImpl.saveWithGeneratedIdentifier(SessionImpl.java:790)

at net.sf.hibernate.impl.SessionImpl.save(SessionImpl.java:749)

at org.springframework.orm.hibernate.HibernateTemplate$9.doInHibernate(HibernateTemplate.java:555)

at org.springframework.orm.hibernate.HibernateTemplate.execute(HibernateTemplate.java:363)

at org.springframework.orm.hibernate.HibernateTemplate.save(HibernateTemplate.java:552)

at com.onewaveinc.media.cms.dao.impl.SyncFolderHibernateDao.insertHavaIndex(SyncFolderHibernateDao.java:31)

at com.onewaveinc.media.cms.manager.SyncFolderManager.doImportSyncFolder(SyncFolderManager.java:193)

at com.onewaveinc.media.cms.manager.SyncFolderManager.insertHavaIndex(SyncFolderManager.java:107)

at com.onewaveinc.media.cms.manager.SyncFolderManager.importSyncFolderList(SyncFolderManager.java:607)

at com.onewaveinc.media.cms.web.SyncFolderImportAction.post(SyncFolderImportAction.java:41)

at com.onewaveinc.media.common.web.HttpMethodAction.execute(HttpMethodAction.java:36)

at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)

at com.onewaveinc.media.web.struts.MediaRequestProcessor.processActionPerform(MediaRequestProcessor.java:51)

at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)

at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)

at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:415)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)

at org.ajaxanywhere.AAFilter.doFilter(AAFilter.java:41)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)

at com.onewaveinc.appcommon.security.web.utils.SecurityFilter.doFilter(SecurityFilter.java:89)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)

at org.springframework.orm.hibernate.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)

at com.onewaveinc.media.common.web.SpringHibernateSessionFilter.doFilterInternal(SpringHibernateSessionFilter.java:50)

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)

at com.onewaveinc.media.web.struts.StrutsValidateFilter.doFilter(StrutsValidateFilter.java:38)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)

at com.onewaveinc.appcommon.utils.web.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:168)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)

at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)

at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)

at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)

at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)

at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)

at org.apache.catalina.core.StandardEngin.ve.invoke(StandardEngin.ve.java:109)

at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)

at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)

at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)

at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)

at java.lang.Thread.run(Thread.java:534)




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();
  }
  }

转载地址:http://aohno.baihongyu.com/

你可能感兴趣的文章
开启“互联网+”模式打造智能移动APP巡检系统
查看>>
以太坊和区块链
查看>>
MyBatis3-以接口方式编程
查看>>
南开大学提出新物体分割评价指标,相比经典指标错误率降低 69.23%
查看>>
Eureka安全访问
查看>>
看Facebook如何基于物理安全保护数据
查看>>
初创公司MindMaze研发情绪反应VR,让VR关怀你的喜怒哀乐
查看>>
绕开“陷阱“,阿里专家带你深入理解C++对象模型的特殊之处
查看>>
Apple Watch新玩法:手势操控无人机
查看>>
ElasticSearch
查看>>
2018“一带一路”阿里巴巴诸神之战全球创客大赛全面启动
查看>>
快轮天才发明家刘峰,上榜福布斯2017年亚洲人物
查看>>
9-51单片机ESP8266学习-AT指令(测试TCP服务器--51单片机程序配置8266,C#TCP客户端发信息给单片机控制小灯的亮灭)...
查看>>
物联网安全形势严峻——除严加管控外别无选择
查看>>
深度学习机器72小时自学国际象棋达到大师水平
查看>>
香港设计师带来仿生机器人,其身体 70% 构造均由3D打印完成
查看>>
探测能源、跨洲安全通信……你所想不到的量子技术!
查看>>
bootstrap16-上下文表格布局
查看>>
不规则物体形状匹配综述
查看>>
自动化设计-框架介绍 TestCase
查看>>