(JPA) Detached Entity in Session aktualisieren

Hi,

in einer Session liegt eine detached entity. Diese entity wird (ganz selten mal) aktualisiert. Wenn sie allerdings aktualisiert wird, geschieht das nicht direkt auf dem Objekt, welches in der Session liegt, sondern auf einer anderen attachten Instanz, die direkt vom Entitymanager geholt wird.
Wie aktualisiere ich jetzt am sinnvollsten die detached entity? Gibt es da eine best practice?

Viele Grüße
Christian

Das mit der anderen Instanz hab ich nicht so ganz verstanden. Mit refresh wird der State aus der Datenbank aktualisiert.

Das angehängte Bild ist zwar eigentlich ein Klassendiagramm, aber so ließ es sich schnell er stellen. Der Client verändert eine Entity. Dieselbe Entity ist in einem Container, der in der Session liegt, detached gespeichert.
Der Container hat jetzt aber eine längere Lebensdauer als der Client / die attachte Entity, also muss die enthaltene detached Entity aktualisiert werden.

Das Problem ist weniger an die aktuelle Instanz zu kommen, als ein passendes unaufwändiges Pattern, um den Container zu aktualisieren.

Eine Möglichkeit wäre ein Subscriberpattern. Die Aktualisierung sollte aber nach Möglichkeit noch unaufdringlicher erfolgen.

Das ORM führt eine Liste mit Entities die attached sind und verfolgt deren Änderungen.
Du müsstest deine Entity bzw. den Container wieder in eine Session hängen und dann updaten, dazu könntest du die Methode EM#merge verwenden, diese „mischt“ die Änderungen in der DB mit denen in der Entity, wenn du selber keine Änderungen an der Entity durchgeführt hast sondern die aus einer anderen Session kamen, kannst du auch EM#refresh nehmen, diese überschreibt eventuelle Änderungen in der Entity und bringt auf den Stand aus der DB.

Mit ist kein JPA Listener bekannt, aber man Implementierungen scheinen sowas zu unterstützen, Hibernate hat ein Eventsystem, EclipseLink auch, hab ich aber noch nie genutzt.

Nachtrag: Sehe gerade dass es sowas in JPA gibt, aber hab ich auch noch nie eingesetzt :slight_smile:

Meinst du damit die mittels @EntityListeners festlegbaren Listenerklassen mit den @PostPersist etc. annotierten Methoden?
Wenn ja, ist der Ansatz nicht wirklich geeignet, da mit DI-Container inkompatibel. Die Listenerklassen werden direkt statisch initialisiert, sodass man sie partout nicht in den DI-Kontext bekommt.

An die aktualisierte Entity zu kommen ist nicht das Problem.