Spring Data: Lazy Fetch mit Self-Join.

stefan2342

Mitglied
Hallo!

Ich habe eine in der Datenbank abgelegte Baumstruktur. Um die Baumstruktur abrufen zu können habe ich mir eine Entitätsklasse angelegt, die mit @OneToMany auf sich selbst verweist. Als Initialisierungsmethode hatte ich zunächst Lazy eingestellt, was dann aber dazu geführt hat, dass ich außerhalb einer Transaktion die Kindelemente nicht abrufen kann ("
failed to lazily initialize a collection of role").

Auf Eager möchte ich aber auch nicht umstellen, weil es in meinem Fall dazu führen würde, dass im Zweifel eine große Baumstruktur immer und immer wieder initialisiert wird, obwohl es nicht nötig ist. Im übrigen wäre das der Performance abträglich.

Hat jemand einen Tipp, wie ich das am Besten in den Griff bekomme? Kann ich irgendwo einstellen, dass automatisch eine Transaktion geöffnet wird, wenn ich auf die Kindelemente zugreifen möchte?

Viele Grüße
Stefan
 
Ich hab mir jetzt was zurechtgebastelt, was meinen Anforderungen entspricht.

Zuerst hab ich ein ein eigenes Interface erstellt, was mein NodeRepository erweitert:

Java:
public interface NodeRepositoryCustom {
   public Node findOneWithChildrenInit(Long id);
}

und habe es dann entsprechend implementiert:

Java:
public class NodeRepositoryImpl implements NodeRepositoryCustom {

    @Autowired
    NodeRepository repo;

    @Override
    @Transactional
    public Node findOneWithChildrenInit(Long id) {
        Node node = repo.findOne(id);
        node.getChildren().size();
        return node;
    }

}

So kann ich flexibel meine Nodes aus dem Repository holen. Entweder ohne initialisierte Kindelemente mit findOne() oder mit initialisierten Kindelementen mit findOneWithChildrenInit(). Eine Rekursion wie es mit EAGER Loading gibt es hier an der stelle nicht.

Einziger Nachteil ist, dass ich so immer das Repository befragen muss, um durch die ganze Baumstruktur zu wandern. Aber man kann wohl nicht alles haben. 🙂
 

Zurück
Oben