2016-09-30 4 views
2

ich ein großes Projekt von Eclipse bin Migration JPA Hibernate, dass die berühmte Ausnahme, die ich Hibernate bewegt auf Wildfly 10.0 läuftIn Hibernate JPA, wie transparent lösen „failed eine Sammlung von Rolle zu faul initialisieren“ Ausnahme

Einmal bekam "Ich versäumte es, eine Sammlung von Rollen zu initialisieren"

Ich fand viele Lösungen für dieses Problem wie diese Vorschläge zu dieser Question sowie die alte OpenSessionInView Methode.

Aber diese Lösungen sind irgendwie veraltet, und benötigt einige Änderungen auf meinem laufenden Code, die Eclipselink verwenden.

Ist eine neuere, moderne, transparente Lösung, die meine Zeit sparen kann?

Hinweis: Ich verwende keine Feder (nur JPA und EJB).

+2

Die Ursache des Problems hat sich in der ganzen Zeit nicht geändert, daher sind die gefundenen Lösungen immer noch sehr relevant. JPA 2.1 fügte Unterstützung für [entity graphs] hinzu (http://www.thoughts-on-java.org/jpa-21-entity-graph-part-1-named-entity/), die eine "modernere" Lösung darstellen - Das erfordert immer noch, dass Sie den Code umgestalten. Es gibt keine Zeit Sparer ich fürchte, anders als zurück zu EclipseLink, die gut auf Wildfly 10 funktionieren kann. – Gimby

Antwort

3

Ich denke, Sie suchen nach der hibernate.enable_lazy_load_no_trans Konfigurationseigenschaft. Aber das ist ein Anti-Pattern. Nur weil andere JPA-Anbieter es verwenden, heißt das nicht, dass es auch effizient ist oder sogar angemessen ist.

Eine weitere schlechte Möglichkeit, die LazyInitializationException zu "reparieren", ist die Open Session in View, which is also an Anti-Pattern.

Die best way to handle LazyInitializationException ist JOIN FETCH alle eins-zu-eins und viele-zu-eins-Verknüpfungen und bis zu einer einzigen Eins-zu-viele-Verknüpfung.

Wenn Sie mehrere Eins-zu-Viele- oder Viele-zu-Viele-Verknüpfungen abrufen müssen, sollte die erste JOIN FETCH-ed sein, während die nachfolgenden mit einer separaten Abfrage initialisiert werden sollen. Sie können entweder durch die Verknüpfung navigieren, um die Initialisierung auszulösen, oder Hibernate#initialize verwenden.

+0

Aber warum in aller Welt nicht Winterschlaf Team lösen dieses Alter Problem? Oder mit anderen Worten, welche Vorteile haben wir davon, dieses Feature nicht zu implementieren? –

+0

Es hat. Wenn Sie gezwungen werden, zu begründen, wie Sie Ihre Assoziationen abrufen, erhalten Sie eine optimale Leistung. "Fixing it" mit OSIV oder temporärer Session, die auch von Hibernate unterstützt werden, ist keine wirkliche Lösung. Es gibt keine Silberkugel. –

+0

Auf der anderen Seite hat Eclipselink eine magische Lösung geschaffen, die dem Entwickler die Möglichkeit gibt, auf jede faule Liste zuzugreifen, wann immer er möchte, ohne benannte Abfragen mit JPQL zu schreiben, die JOIN FETCH verwenden. –

Verwandte Themen