2012-07-03 39 views
1

我们将用户对象保留在会话中。当我们第一次更新它(使用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.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) 

我使用的弹簧,休眠& JPA。 Spring在DAO中注入EntityManager。我明白,如果我会每次都做一个新的find(),然后对该对象进行所有更改,然后merge()..它会正常工作..但在我的情况下,我不能这样做。

我也检查过,使用的EntityManager的哈希码是相同的时间;即同一个EntityManager实例正在使用这两个时间那么为什么它在尝试第二次更新记录时会产生此异常

任何帮助将不胜感激。

回答

0

当您在当前事务中调用merge方法时,hibernate会将给定对象的状态复制到具有相同标识符的持久对象上,并返回新的可管理实体。您需要处理合并在后续操作中返回的可管理实体,因为此实体的新版本比数据库中的版本更新。

+0

我试图根据这个假设进行调试;合并确实会返回一个新的对象(具有不同的哈希码),但它与原始对象具有相同的版本。我认为在调用commit后版本会更新(这是由spring框架完成的) – Deepak

2

我尝试了很多东西,但没有任何工作。即使在互联网上也没有解决办法。最后,当我从我的实体中删除版本(即删除由休眠提供的OptimisticLockException支持)时,一切都开始正常工作。可能我会尝试自己处理OLE。