Hibernate - Cascade-Beispiel (speichern, aktualisieren, löschen und verwaisten löschen)
Cascade ist eine praktische Funktion zum Speichern der Codezeilen, die zum manuellen Verwalten des Status der anderen Seite erforderlich sind.
Das Schlüsselwort "Cascade" wird häufig in der Sammlungszuordnung angezeigt, um den Status der Sammlung automatisch zu verwalten. In diesen Tutorials wird diesesone-to-many example verwendet, um den Kaskadeneffekt zu demonstrieren.
Beispiel für das Speichern / Aktualisieren in Kaskade
Wenn in diesem Beispiel ein "Bestand" gespeichert wird, sollten auch alle seine referenzierten "stockDailyRecords" in der Datenbank gespeichert werden.
1. Keine Kaskade zum Speichern und Aktualisieren
Wenn Sie inprevious section den "Bestand" und den referenzierten "StockDailyRecord" in der Datenbank speichern möchten, müssen Sie beide einzeln speichern.
Stock stock = new Stock(); StockDailyRecord stockDailyRecords = new StockDailyRecord(); //set the stock and stockDailyRecords data stockDailyRecords.setStock(stock); stock.getStockDailyRecords().add(stockDailyRecords); session.save(stock); session.save(stockDailyRecords);
Ausgabe
Hibernate: insert into example.stock (STOCK_CODE, STOCK_NAME) values (?, ?) Hibernate: insert into example.stock_daily_record (STOCK_ID, PRICE_OPEN, PRICE_CLOSE, PRICE_CHANGE, VOLUME, DATE) values (?, ?, ?, ?, ?, ?)
2. Mit Kaskade zum Speichern und Aktualisieren
Dascascade=”save-update” wird in "stockDailyRecords" deklariert, um den Save-Update-Kaskadeneffekt zu aktivieren.
Stock stock = new Stock(); StockDailyRecord stockDailyRecords = new StockDailyRecord(); //set the stock and stockDailyRecords data stockDailyRecords.setStock(stock); stock.getStockDailyRecords().add(stockDailyRecords); session.save(stock);
Ausgabe
Hibernate: insert into example.stock (STOCK_CODE, STOCK_NAME) values (?, ?) Hibernate: insert into example.stock_daily_record (STOCK_ID, PRICE_OPEN, PRICE_CLOSE, PRICE_CHANGE, VOLUME, DATE) values (?, ?, ?, ?, ?, ?)
Der Codesession.save(stockDailyRecords); wird nicht mehr benötigt. Wenn Sie den "Bestand" speichern, wird der Speichervorgang auf den referenzierten "stockDailyRecords" "kaskadiert" und beide werden automatisch in der Datenbank gespeichert.
Beispiel für Kaskadenlöschung
Wenn in diesem Beispiel ein "Bestand" gelöscht wird, sollten auch alle darin enthaltenen "stockDailyRecords" aus der Datenbank gelöscht werden.
1. Keine Löschkaskade
Sie müssen alle ‘stockDailyRecords’ durchlaufen und einzeln löschen.
Query q = session.createQuery("from Stock where stockCode = :stockCode "); q.setParameter("stockCode", "4715"); Stock stock = (Stock)q.list().get(0); for (StockDailyRecord sdr : stock.getStockDailyRecords()){ session.delete(sdr); } session.delete(stock);
Ausgabe
Hibernate: delete from example.stock_daily_record where DAILY_RECORD_ID=? Hibernate: delete from example.stock where STOCK_ID=?
2. Mit Löschkaskade
Dascascade=”delete” wird in "stockDailyRecords" deklariert, um den Löschkaskadeneffekt zu aktivieren. Wenn Sie den ‘Bestand’ löschen, werden alle Verweise auf ‘stockDailyRecords’ automatisch gelöscht.
Query q = session.createQuery("from Stock where stockCode = :stockCode "); q.setParameter("stockCode", "4715"); Stock stock = (Stock)q.list().get(0); session.delete(stock);
Ausgabe
Hibernate: delete from example.stock_daily_record where DAILY_RECORD_ID=? Hibernate: delete from example.stock where STOCK_ID=?
Cascade Delete-Orphan-Beispiel
Wenn Sie in der obigen Kaskaden-Löschoption einen Bestand löschen, werden auch alle darin enthaltenen ‘stockDailyRecords’ aus der Datenbank gelöscht. Wie wäre es, wenn Sie nur zwei referenzierte "stockDailyRecords" -Datensätze löschen möchten? Dies wird als verwaiste Löschung bezeichnet, siehe Beispiel…
1. Keine Delete-Orphan-Kaskade
Sie müssen die "stockDailyRecords" einzeln löschen.
StockDailyRecord sdr1 = (StockDailyRecord)session.get(StockDailyRecord.class, new Integer(56)); StockDailyRecord sdr2 = (StockDailyRecord)session.get(StockDailyRecord.class, new Integer(57)); session.delete(sdr1); session.delete(sdr2);
Ausgabe
Hibernate: delete from example.stock_daily_record where DAILY_RECORD_ID=? Hibernate: delete from example.stock_daily_record where DAILY_RECORD_ID=?
2. Mit Lösch-Waisenkaskade
Dascascade=”delete-orphan” wird in "stockDailyRecords" deklariert, um den Effekt "Orphan Cascade löschen" zu aktivieren. Wenn Sie den Bestand speichern oder aktualisieren, werden die ‘stockDailyRecords’ entfernt, die bereits als entfernt markiert sind.
StockDailyRecord sdr1 = (StockDailyRecord)session.get(StockDailyRecord.class, new Integer(56)); StockDailyRecord sdr2 = (StockDailyRecord)session.get(StockDailyRecord.class, new Integer(57)); Stock stock = (Stock)session.get(Stock.class, new Integer(2)); stock.getStockDailyRecords().remove(sdr1); stock.getStockDailyRecords().remove(sdr2); session.saveOrUpdate(stock);
Ausgabe
Hibernate: delete from example.stock_daily_record where DAILY_RECORD_ID=? Hibernate: delete from example.stock_daily_record where DAILY_RECORD_ID=?
Kurz gesagt, delete-orphan ermöglicht es der übergeordneten Tabelle, einige Datensätze (delete orphan) in ihrer untergeordneten Tabelle zu löschen.
Wie aktiviere ich die Kaskade?
Die Kaskade wird sowohl in XML-Zuordnungsdateien als auch in Anmerkungen unterstützt.
1. XML-Zuordnungsdatei
Deklarieren Sie in der XML-Zuordnungsdatei das Schlüsselwortcascadein Ihrer Beziehungsvariablen.
2. Anmerkung
Deklarieren Sie in der Annotation dieCascadeType.SAVE_UPDATE (Speichern, Aktualisieren) undCascadeType.REMOVE (Löschen) in der @ Cascade-Annotation.
//Stock.java @OneToMany(mappedBy = "stock") @Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE}) public SetgetStockDailyRecords() { return this.stockDailyRecords; }
Weitere Studie -Cascade – JPA & Hibernate annotation common mistake.
inverse vs Kaskade
Beide sind völlig unterschiedliche Begriffe, siehedifferential here.
Fazit
Cascade ist eine sehr praktische Funktion, um den Status der anderen Seite automatisch zu verwalten. Diese Funktion ist jedoch mit einem Preis verbunden. Wenn Sie sie nicht mit Bedacht einsetzen (Aktualisieren oder Löschen), werden viele unnötige Kaskadeneffekte erzeugt (Kaskadenaktualisierung), um die Leistung zu verringern, oder einige Daten, die Sie nicht verwenden, werden gelöscht (Kaskadenlöschung) erwartet.