JPA Entities mit Proxies ausserhalb einer Session (Lazy Loading)

dbausnnd

Aktives Mitglied
Hallo zusammen,

ich nutze JPA mit Hibernate im Unterbau um Zugriffe auf Datenbanken zu gewährleisten. Der Zugriff auf dem EntityManager wird über den ApplicationContext (Spring) im @Transactional DAO durchgeführt. Bedeutet nach dem laden einer Entity wird die Transaktion geschlossen.

Folgende Möglichkeiten gibt es beim FetchType für Referenzen:

FetchType.EAGER
Unter Umständen werden große Teile der Datenbank geladen, was nicht gewünscht ist aufgrund von Performance.

FetchType.LAZY
Referenzen werden nicht mitgeladen. Nach dem verlassen der DAO Methode wird das Objekt detached und ein Zugriff auf die Referenzen ist nicht mehr möglich. Wenn die Entities in eine andere Schicht übergeben werden besteht die Möglichkeit das von hier auf die Referenzen zugegriffen wird. Die einzige Möglichkeit das abzufangen wäre ein Try Catch Block um die Getter Aufrufe - Unpracktikabel.

Folgende Möglichkeiten bestehen um Referenzen zu laden:

UseCase bezogene Getter Methoden im DAO
Je nach use Case werden die Referenzen mitgeladen oder nicht. Ist eine Entität vollständig ist das wunderbar, jedoch besteht die Gefahr wie beim FetchType.LAZY, wenn die Referenzen nicht geladen werden.

Entität mit Proxy
Der Proxy wird aus dem DAO geliefert. Wird jetzt auf eine Referenz zugegriffen kann der Proxy die Daten nachladen. Er kann Sie natürlich nur komplett nachladen. Hierbei ist viel Code notwendig da das Entitäts Objekt doppelt realisiert wird.

Nachladen in der Entität selber
Bei den Gettern und Settern der Referenzen wird geprüft ob diese geladen wurde oder nicht. Sind die Referenzen Lazy wird das Objekt direkt vom DAO erneut geladen. Problem dabei ist das ich ein ganz neue Entität erhalte. Somit kann eine Entität sich selber nicht nachladen. Auch sollten PoJo´s keine Logik enthalten.

WUNSCHVORSTELLUNG ;)
Ich erzeuge ein unvollständiges Entitäsobjekt aus dem DAO. Sobald auf eine Referenz zugegriffen wird, wird lediglich diese Referenz hinzugeladen. Wird auf eine weitere Referenz zugegriffen wird auch diese nachgeladen, ohne das die erste gelöscht wurde.

Wie habt ihr die Problematik mit den unvollständigen Entitäsobjekten gelöst? Übergebt Ihr einfach diese unvollständigen Objekte? Ist meine Wunschvorstellung evtl doch möglich?

Mich interessieren eure Lösungsansätze.

Schon mal besten Dank

dbausnnd.

Hierbei ist mir das Problem des Lazy Loadings bewusst. Natürlich will man nicht immer die Daten FetchType.EAGER laden (Performance).
 
Zuletzt bearbeitet:

Ähnliche Java Themen


Oben