2016-06-01 16 views
1

Ich habe ein Problem, das gegen mein Verständnis davon, wie es funktionieren soll, geht. Ich habe einen Arquillian-Test, der eine Repository-Methode mit einer JPA-Abfrage testet.JPA EntityManager.detach() noch faule Beziehungen laden

Der Test beharrt ein Objekt und beharrt dann ein anderes Objekt mit dem ersten persistenten Objekt in einem Feld. Dann ruft es die Repository-Methode auf. Als nächstes löst der Test (und löscht den EntityManager, überprüft, ob das Objekt nicht in der EM enthalten ist usw.). Zuletzt überprüft der Test, ob das zugehörige Objekt vorhanden ist oder nicht (dies sollte nicht geschehen, da die Abfrage die Beziehung nicht lesen soll).

Wie erwartet, wenn Sie im Debugger suchen, ist das zugehörige Objekt Null, aber wenn das Assert tatsächlich die getRelatedObject-Methode verwendet, wird das zugehörige Objekt geladen.

Pseudocode zu klären (hoffe ich):

FirstObject f = new FirstObject(); 
em.persist(f); 
SecondObject s = new SecondObject(); 
s.setFirstObject(f); 
em.persist(f); 
MyRepo r = new MyRepo(); 
SecondObject result = r.runQuery(f.getId()); 
em.detach(result); //result.getFirstObject is null 
em.clear(); 
assertIsNull(result.getFirstObject()); //loads first object and test fails 

Ist es mein Verständnis, dass falsch ist, sollte das zugehörige Objekt lädt noch? Ich habe eine LazyInit-Ausnahme erwartet.

Wenn ich mein Verständnis falsch ist, wie zu überprüfen, dass eine Abfrage nicht verwandte Objekt bevölkert werde ich nicht nicht?

(ja, mit dto-Objekte anstelle des Unternehmens besser ist, ich weiß ... wir haben diese Diskussion hatte und ich war außer Kraft gesetzt) ​​

Antwort

3

Das Buch Pro JPA 2 (Apress, p160) stellt fest,

„das Verhalten eines unbelasteten Zugriff auf das Attribut, wenn das Unternehmen abgelöst ist nicht definiert ist. Einige Anbieter versuchen, könnte die Beziehung, zu lösen, während andere vielleicht einfach eine Ausnahme auslösen oder verlassen das Attribut nicht initialisiert.“

Ich habe keine Erfahrung von Eclipse persönlich und alles endgültig in der Dokumentation in diesem Bereich jedoch alle schlagen die folgenden Links, dass Eclipse die Beziehung finden kann versuchen und lösen, wenn Sie einen faulen Verband auf einer frei stehende Sammlung zugreifen.

Eclipselink Lazy Loading

http://issues.apache.org/jira/browse/OPENJPA-2483

http://blog.ringerc.id.au/2012/06/jpa2-is-very-inflexible-with-eagerlazy.html