Rob
Rob

Reputation: 1365

Hibernate: Safely reattach an object to the session

I'm maintaining a cache of objects across hibernate sessions by storing (possibly-detached) objects in a map. When the cache gets a hit, I test if the object is already part of the session with Session.contains(object). If not, I re-attach it with Session.lock(object, LockMode.NONE).

The problem is, if the same object was loaded previously in the session, it throws a org.hibernate.NonUniqueObjectException. Given a detached instance, I see no way to find out in advance if this exception will get thrown, without possibly hitting the database.

There are a couple workarounds:

  1. Reattach all cached objects at the start of every transaction.
  2. Catch the NonUniqueObjectException and then call session.load(object.class, object.getId());

Neither of these are as clean as checking the session in advance for an object class + id.

Is there any way to do that?

Upvotes: 11

Views: 17401

Answers (2)

Pascal Thivent
Pascal Thivent

Reputation: 570635

I'm maintaining a cache of objects across hibernate sessions

Not a direct answer but why don't you use Hibernate L2 cache for this instead of reinventing the wheel?

Upvotes: 0

Raj
Raj

Reputation: 2920

Session.merge() should do it:

obj = session.merge(obj);

Upvotes: 4

Related Questions