嗨我有一个conversation.access scoped bean,它持有我的userobject
public class UserEntity {
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "userEntity")
@JsonIgnore
private List<UserAuthorityEntity> userAuthorityEntities = new ArrayList<UserAuthorityEntity>();
}
直到第二个请求一切正常并且所有内容都在DB中保持正确。
但是在第三个请求中我得到了错误
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”表示他正在寻找我在第二个请求中删除的对象。
任何想法都错了吗?
答案 0 :(得分:2)
我遇到了同样的问题。我尝试了四种方法来解决这个问题。一切工作。
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)
然后我做了一些研究,想知道是什么使这些解决方案成为可能。请注意第二个解决方案根据{{3}} clear
清除L1缓存。所以我相信在合并之后,数据仍然存储在缓存中。 Clear
将分离与此会话关联的所有对象。
注意第一个解决方案。根据{{1}}和saveOrUpdate
之间的org.hibernate.Session.clear() considered Harmful?差异,merge
使对象持久,而saveOrUpdate
返回持久对象。再次合并时,由于参数不是持久性的,因此hibernate使用缓存从db加载对象。这导致奇怪的查询。
所以我来到了第四个解决方案。这使您的用户成为附加对象。然后当你再次合并时,它正在合并持久对象。 Hibernate这次不查询db。
至于第3种解决方案。它来自一次审判。
这是我对这个问题的理解。不确定它是否准确。但我希望这会有所帮助。为安全起见,我建议您使用merge
和solution 1
。