Spring 在hibernate中尝试第二次更新记录时出现异常
我们将用户对象保持在会话中。当我们第一次更新它时(使用entityManager.merge(ent)),它工作得很好;但第二次我得到以下例外:Spring 在hibernate中尝试第二次更新记录时出现异常,spring,hibernate,jpa,Spring,Hibernate,Jpa,我们将用户对象保持在会话中。当我们第一次更新它时(使用entityManager.merge(ent)),它工作得很好;但第二次我得到以下例外: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.kids.domain.Child#22] at org.hibern
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.kids.domain.Child#22]
at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:492)
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:256)
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:86)
at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:781)
at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:766)
我将spring与hibernate和jpa一起使用。弹簧在道中注入了完整的管理器。我知道如果我每次都做一个新的find(),然后对该对象进行所有更改,然后合并()。。它会很好用的。。但就我而言,我不能这样做
我还检查了EntityManager的hashcode在两次使用时是否相同;i、 同一个EntityManager实例在这两次都被使用,那么为什么在第二次尝试更新记录时会出现此异常
非常感谢您的帮助。当您在当前事务中调用merge方法时,hibernate会将给定对象的状态复制到具有相同标识符的持久对象上,并返回新的可管理实体。您需要处理合并在后续操作中返回的可管理实体,因为该实体的版本比DB中的版本要新。我尝试了很多方法,但都没有成功。即使在互联网上也没有解决办法。最后,当我从实体中删除版本时(即删除hibernate提供的OptimisticLockException支持)。。一切都很顺利。可能,我会尝试自己处理OLE。我尝试基于此假设进行调试;merge确实返回一个新对象(使用不同的hashcode),但它的版本与原始对象相同。我认为在调用commit(由springframework完成)之后,版本会得到更新