Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hibernate Error: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session [duplicate]

Possible Duplicate:
Hibernate: different object with the same identifier value was already associated with the session

I have got almost the same problem like that user.

In my situation I load one entity from db, I convert this entity into a DataTransferObject, then I want to edit one attribute, after that I convert it back into an entityObject, then I update that entity and hibernate throws following error:

Hibernate Error: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session

Apparently, the problem is that the object I retrieve from db has the same id as the one I want to update (like it should be) BUT those are not the same objects!

How to manage that? Thank you for help...

like image 270
Sven Avatar asked Aug 31 '10 13:08

Sven


2 Answers

Your problem is that the object you previously loaded still exists in your hibernate session. I see two ways to cope with that.

1.) tell the hibernate session to merge your modified object with the one in the session

session.merge(object)

2.) kick the old object out of the session before writing the updated object to the session. session.clear() might work.

like image 62
rompetroll Avatar answered Sep 20 '22 15:09

rompetroll


This is a very common problem with Hibernate. Even if you delete it from the session, the object will stay in Hibernate PersistanceContext and you will have the same problem. The problem is also coming from the fact that session.contains uses object equality, and not equals() to compare the object...

The story is the following: you have object A and object B,which are the same logical object, but two different objects in your java heap. and you have long time ago did something with object A in the session.

Now if you do session.delete(B) you will get the exception, because you are trying to delete an object which has the same primary key as A, but is not A.

The solution is simple:

Object findAAgain=session.merge(B);
session.delete(findAAgain);

the merge returns the instance of the object you have in the session first.

like image 23
Edmondo1984 Avatar answered Sep 22 '22 15:09

Edmondo1984