Ich neige dazu, Hibernate in Kombination mit dem Spring- Framework und seinen deklarativen Transaktionsabgrenzungsfunktionen (z . B. @Transactional ) zu verwenden.
Wie wir alle wissen, versucht der Winterschlaf, so wenig invasiv und transparent wie möglich zu sein. Dies ist jedoch bei der Verwendung von Beziehungen etwas schwierigerlazy-loaded
.
Ich sehe eine Reihe von Designalternativen mit unterschiedlichen Transparenzstufen.
- Machen Sie Beziehungen nicht faul geladen (z.
fetchType=FetchType.EAGER)
- Dies vioalites die gesamte Idee des faulen Ladens ..
- Initialisieren Sie Sammlungen mit
Hibernate.initialize(proxyObj);
- Dies impliziert eine relativ hohe Kopplung an das DAO
- Obwohl wir eine Schnittstelle mit definieren können
initialize
, wird nicht garantiert, dass andere Implementierungen eine Entsprechung bieten.
- Fügen Sie den persistenten
Model
Objekten selbst Transaktionsverhalten hinzu (entweder mit dynamischem Proxy oder@Transactional
)- Ich habe den dynamischen Proxy-Ansatz nicht ausprobiert, obwohl ich @Transactional anscheinend nie dazu gebracht habe, an den persistenten Objekten selbst zu arbeiten. Wahrscheinlich aufgrund dieses Ruhezustands ist die Operation auf einem Proxy zu sein.
- Kontrollverlust, wenn Transaktionen tatsächlich stattfinden
- Stellen Sie sowohl die Lazy / Non-Lazy-API bereit, z. B.
loadData()
undloadDataWithDeps()
- Erzwingt, dass die Anwendung weiß, wann welche Routine anzuwenden ist, wieder eine enge Kopplung
- Methodenüberlauf ,,
loadDataWithA()
....,loadDataWithX()
- Erzwingen Sie die Suche nach Abhängigkeiten, z. B. indem Sie nur
byId()
Operationen bereitstellen- Benötigt eine Menge nicht objektorientierter Routinen, z. B.
findZzzById(zid)
und danngetYyyIds(zid)
anstelle vonz.getY()
- Es kann nützlich sein, jedes Objekt in einer Sammlung einzeln abzurufen, wenn zwischen den Transaktionen ein großer Verarbeitungsaufwand besteht.
- Benötigt eine Menge nicht objektorientierter Routinen, z. B.
- Machen Sie einen Teil der Anwendung @Transactional anstelle nur des DAO
- Mögliche Überlegungen zu verschachtelten Transaktionen
- Erfordert Routinen, die für das Transaktionsmanagement angepasst sind (z. B. ausreichend klein)
- Kleine programmatische Auswirkungen, obwohl dies zu großen Transaktionen führen kann
- Stellen Sie dem DAO dynamische Abrufprofile zur Verfügung , z.
loadData(id, fetchProfile);
- Anwendungen müssen wissen, welches Profil wann verwendet werden soll
- Transaktionen vom Typ AoP, z. B. Abfangen von Operationen und Ausführen von Transaktionen, falls erforderlich
- Erfordert die Manipulation von Bytecode oder die Verwendung von Proxys
- Kontrollverlust bei Transaktionen
- Schwarze Magie wie immer :)
Habe ich eine Option verpasst?
Welches ist Ihr bevorzugter Ansatz, wenn Sie versuchen, die Auswirkungen von lazy-loaded
Beziehungen in Ihrem Anwendungsdesign zu minimieren ?
(Oh, und Entschuldigung für WoT )