错误如下:
2017-3-29 15:17:52~ERROR~org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:253)~Servlet.service() for servlet action threw exception
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.tcc.operator.dto.TblTcclinkClosure#1002]
at org.hibernate.engine.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:556)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:258)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:216)
at org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:559)
at org.hibernate.impl.SessionImpl.update(SessionImpl.java:547)
at org.hibernate.impl.SessionImpl.update(SessionImpl.java:539)
at com.tcc.operator.biz.OperatorBiz.updateLinkclosure(OperatorBiz.java:520)
at com.tcc.operator.action.UpdateConstructionAction.execute(UpdateConstructionAction.java:38)

 

 

一开始session.update(Object o)出现这样的问题,但是通过使用session.merge(Object o)解决了,因为merge()会判断session pool中是否有同样的对象,有则update(),没有则seve()。
但后来发现session.delete(Object o)也出现同样的问题。没办法,只能找根本原因。最后发现啊extends Action的时候我new了一个需要更新的Object,然后用ActionForm里的值赋值。这样一来,提供给hibernate更新的对象和你本来想要更新的对象属于不同对象,但却有相同的标识。因此hibernate抛出NonUniqueObjectException。
解决方法是,通过ActionForm里的标识,find真正要更新的对象,然后用ActionForm里的值替换该对象的值。
再执行update()或delete();问题就解决了。

posted on 2017-03-29 16:51  JamelAr  阅读(268)  评论(0编辑  收藏  举报