Wir haben bereits in früheren Tutorials wie Eins-zu-Eins-Mapping und Eins-zu-Viele-Mappings über die Zuordnung zugehöriger Entitäten in Hibernate gelernt. Dort wollten wir die zugeordnete Entität speichern, wenn die Entität des Beziehungsbesitzers gespeichert wurde. Um dies zu ermöglichen, hatten wir das Attribut „CascadeType“ verwendet. In diesem Tutorial zu JPA-Kaskadentypen erfahren Sie mehr über verschiedene verfügbare Optionen für die Kaskadierung über CascadeType.
Wie funktionieren JPA-Kaskadentypen?
Bevor wir fortfahren, schauen wir uns an, wie dieses Kaskadentypattribut in Ihrem Code definiert ist. Lassen Sie uns ein Beispiel für ein klareres Verständnis haben. Nehmen wir ein Szenario, in dem ein Mitarbeiter mehrere Konten haben kann; Ein Konto muss jedoch nur einem Mitarbeiter zugeordnet sein. Lassen Sie uns aus Gründen der Klarheit Entitäten mit minimalen Informationen erstellen.In:EmployeeEntity.java
AccountEntity.java
Sehen Sie sich die fette Zeile im obigen Quellcode für EmployeeEntity.java
an. Es definiert „cascade=CascadeType.ALL
“ und bedeutet im Wesentlichen, dass jede Änderung an EmployeeEntity
kaskadiert werden muss AccountEntity
auch. Wenn Sie einen Mitarbeiter speichern, werden auch alle zugehörigen Konten in der Datenbank gespeichert. Wenn Sie einen Mitarbeiter löschen, werden auch alle mit diesem Mitarbeiter verknüpften Konten gelöscht. Einfach genug.
Aber was ist, wenn wir nur kaskadieren wollen, nur Operationen speichern, aber nicht löschen. Dann müssen wir es mit dem folgenden Code klar angeben.
Nur wenn die Methoden save() oder persist() mit der employee Instanz aufgerufen werden, werden nur Konten beibehalten. Wenn eine andere Methode in der Sitzung aufgerufen wird, wirkt sich dies nicht auf Konten aus / kaskadiert sie.
JPA-Kaskadentypen
Die von der Java-Persistenzarchitektur unterstützten Kaskadentypen lauten wie folgt:
- CascadeType.PERSIST : Kaskadentyp
presist
bedeutet, dass save() – oder persist() -Operationen auf verwandte Entitäten kaskadiert werden. - Kaskadentyp.ZUSAMMENFÜHREN : kaskadentyp
merge
bedeutet, dass verwandte Entitäten zusammengeführt werden, wenn die besitzende Entität zusammengeführt wird. - Kaskadentyp.REFRESH : cascade type
refresh
macht dasselbe für die refresh() -Operation. - Kaskadentyp.REMOVE : cascade type
remove
entfernt alle zugehörigen Entitäten, die mit dieser Einstellung verknüpft sind, wenn die besitzende Entität gelöscht wird. - Kaskadentyp.DETACH : Kaskadentyp
detach
trennt alle zugehörigen Entitäten, wenn eine „manuelle Trennung“ auftritt. - Kaskadentyp.ALLER : kaskadentyp
all
ist eine Abkürzung für alle oben genannten Kaskadenoperationen.
In JPA gibt es keinen Standardkaskadentyp. Standardmäßig werden keine Operationen kaskadiert.
Die Kaskadenkonfigurationsoption akzeptiert ein Array von CascadeTypes; Wenn Sie also nur Aktualisierungen und Zusammenführungen in die Kaskadenoperation für eine Eins-zu-Viele-Beziehung wie in unserem Beispiel einbeziehen, sehen Sie möglicherweise Folgendes:
Die obige Kaskadierung führt dazu, dass die Sammlung nur zusammengeführt und aktualisiert wird.
Hibernate-Kaskadentypen
Lassen Sie uns nun verstehen, was eine Kaskade im Ruhezustand ist, in welchem Szenario wir sie verwenden.
Abgesehen von den von JPA bereitgestellten Kaskadentypen gibt es im Ruhezustand eine weitere Kaskadenoperation, die nicht Teil des oben diskutierten normalen Satzes ist und als „Orphan Removal“ bezeichnet wird. Dadurch wird ein eigenes Objekt aus der Datenbank entfernt, wenn es aus seiner Eigentümerbeziehung entfernt wird.
Lassen Sie uns anhand eines Beispiels verstehen. In unserem Beispiel für Mitarbeiter- und Kontoentitäten habe ich sie wie folgt aktualisiert und „orphanRemoval = true“ für Konten erwähnt. Es bedeutet im Wesentlichen, dass jedes Mal, wenn ich ein ‚Konto aus dem Kontosatz‘ entferne (was bedeutet, dass ich die Beziehung zwischen diesem Konto und dem Mitarbeiter entferne); Die Kontoentität, die keinem anderen Mitarbeiter in der Datenbank zugeordnet ist (dh verwaist), sollte ebenfalls gelöscht werden.In:EmployeeEntity.java
AccountEntity.java
TestOrphanRemovalCascade.java
Es ist eine sehr gute Möglichkeit, übereinstimmende / nicht übereinstimmende Elemente aus einer Sammlung zu entfernen (dh Viele-zu-Eins- oder Eins-zu-Viele-Beziehungen). Sie entfernen einfach das Element aus der Sammlung und Hibernate kümmert sich um den Rest der Dinge für Sie. Es wird überprüft, ob die Entität von einem beliebigen Ort aus referenziert wird oder nicht; Wenn dies nicht der Fall ist, wird die Entität aus der Datenbank selbst gelöscht.
Teilen Sie mir Ihre Gedanken und Fragen zu Hibernate 5-Kaskadentypen oder JPA-Kaskadentypen mit, falls vorhanden.
Viel Spaß beim Lernen !!
Oracle Blog on cascade types