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)