0

Hi i have an conversation.access scoped bean which holds my userobject

public class UserEntity {
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "userEntity")
    @JsonIgnore
    private List<UserAuthorityEntity> userAuthorityEntities = new ArrayList<UserAuthorityEntity>();
}
  • on the first request the user is loaded
  • on the second request i remove one UserAuthorityEntity from the list and merge the user
  • on the third request i remove another UserAuthorityEntity from the list and merge the user

until the second request everything runs fine and everything is persisten in DB correct.

but on the third request i get en error

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)

the "AuthoritiesEntityUserEntityPK" indicates that he is looking for the object i deleted in the second request.

any ideas whats wrong?

wutzebaer
  • 14,365
  • 19
  • 99
  • 170

1 Answers1

2

I encountered the same problem. And I tried 4 ways to walk around this problem. All work.

 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)

Then I did some research wondering what make these solutions possible. Note the 2nd solution. According to org.hibernate.Session.clear() considered Harmful? clear clears the L1 cache. So I believe after you merge, somehow data is still stored in cache. Clear will detach all the objects associated with this session.

Note 1st solution. According to this hibernate envers: merge & saveOrUpdate difference between saveOrUpdate and merge is that saveOrUpdate makes the object persistent, whereas merge return the persistent object. When you merge again, since the argument is not persistent, hibernate uses the cache to load object from db. This results in the strange query.

So I came to the 4th solution. This makes your user the attached object. Then when you merge again, it is merging the persistent object. Hibernate doesn't query db this time.

As for the 3rd solution. It came from a trial.

These are my understanding for this question. Not sure if it's accurate. But I hope this helps. To be safe, I recommend you use solution 1, and solution 4.

Community
  • 1
  • 1