【问题标题】:Hibernate 4 merge detached Object twiceHibernate 4合并分离的对象两次
【发布时间】:2013-09-11 11:20:33
【问题描述】:

您好,我有一个包含我的用户对象的 conversation.access 范围 bean

public class UserEntity {
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "userEntity")
    @JsonIgnore
    private List<UserAuthorityEntity> userAuthorityEntities = new ArrayList<UserAuthorityEntity>();
}
  • 在加载用户的第一个请求时
  • 在第二个请求中,我从列表中删除一个 UserAuthorityEntity 并合并用户
  • 在第三个请求中,我从列表中删除了另一个 UserAuthorityEntity 并合并用户

直到第二个请求一切正常并且一切都在数据库中正确持久化。

但是在第三个请求中我得到了错误

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [mypackage.common.account.UserAuthorityEntity#mypackage.common.account.UserAuthorityEntity$AuthoritiesEntityUserEntityPK@63f4adf]
    at org.hibernate.internal.SessionFactoryImpl$1$1.handleEntityNotFound(SessionFactoryImpl.java:244)
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:212)
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:262)
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:150)
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1092)
    at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1019)
    at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:672)
    at org.hibernate.type.EntityType.resolve(EntityType.java:490)
    at org.hibernate.type.EntityType.replace(EntityType.java:354)
    at org.hibernate.type.CollectionType.preserveSnapshot(CollectionType.java:558)
    at org.hibernate.type.CollectionType.replaceElements(CollectionType.java:532)
    at org.hibernate.type.CollectionType.replace(CollectionType.java:660)
    at org.hibernate.type.TypeHelper.replace(TypeHelper.java:177)
    at org.hibernate.event.internal.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:372)
    at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:309)
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:151)
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:76)
    at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:914)
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:898)
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:902)
    at mypackage.dao.MainDao.merge(MainDao.java:105)

“AuthoritiesEntityUserEntityPK”表示他正在寻找我在第二个请求中删除的对象。

有什么想法吗?

【问题讨论】:

    标签: hibernate merge


    【解决方案1】:

    我遇到了同样的问题。我尝试了 4 种方法来解决这个问题。所有工作。

     1. change merge(User) to saveOrUpdate(User)
     2. After merge, call session.clear()
     3. Use a new session for the second merge 
     4. User = merge(User)
    

    然后我做了一些研究,想知道是什么让这些解决方案成为可能。注意第二种解决方案。根据org.hibernate.Session.clear() considered Harmful?clear清除L1缓存。所以我相信在你合并之后,数据仍然以某种方式存储在缓存中。 Clear 将分离与此会话关联的所有对象。

    注意第一种解决方案。根据这个hibernate envers: merge & saveOrUpdatesaveOrUpdatemerge之间的区别是saveOrUpdate使对象持久化,而merge返回持久化对象。当你再次合并时,由于参数不是持久的,hibernate 使用缓存从 db 加载对象。这会导致奇怪的查询。

    所以我来到了第四个解决方案。这使您的用户成为附加对象。然后当你再次合并时,它正在合并持久对象。 Hibernate 这次不查询 db。

    至于第三种解决方案。它来自一次试验。

    这些是我对这个问题的理解。不确定它是否准确。但我希望这会有所帮助。为了安全起见,我建议您使用solution 1solution 4

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 2011-09-20
      • 1970-01-01
      相关资源
      最近更新 更多