Ruhezustand: Bringen Sie ein Objekt sicher wieder an der Sitzung an

9

Ich führe einen Cache von Objekten über Hibernate-Sitzungen hinweg, indem (möglicherweise losgelöste) Objekte in einer Karte gespeichert werden. Wenn der Cache einen Treffer erzielt, teste ich, ob das Objekt bereits Teil der Sitzung mit Session.contains(object) ist. Wenn nicht, verknüpfe ich es erneut mit Session.lock(object, LockMode.NONE) .

Das Problem ist, wenn das gleiche Objekt zuvor in der Sitzung geladen wurde, wird eine org.hibernate.NonUniqueObjectException ausgelöst. Bei einer getrennten Instanz sehe ich keine Möglichkeit, im Voraus herauszufinden, ob diese Ausnahme ausgelöst wird, ohne möglicherweise die Datenbank zu treffen.

Es gibt einige Problemumgehungen:

  1. Hängen Sie alle zwischengespeicherten Objekte am Anfang jeder Transaktion wieder an.
  2. Fangen Sie die NonUniqueObjectException ab und rufen Sie session.load auf (object.class, object.getId ());

Keines davon ist so sauber wie die Überprüfung der Sitzung im Voraus für eine Objektklasse + ID.

Gibt es eine Möglichkeit, das zu tun?

    
Rob 28.04.2010, 14:33
quelle

2 Antworten

4

Session.merge () sollte es tun:

%Vor%     
Raj 28.04.2010 18:59
quelle
0
  

Ich führe einen Cache von Objekten in Hibernate-Sitzungen

Keine direkte Antwort, aber warum verwenden Sie den Hibernate L2-Cache nicht dafür, das Rad neu zu erfinden?

    
Pascal Thivent 28.04.2010 19:16
quelle

Tags und Links