Ruhezustand - Kaskadenbeispiel (Speichern, Aktualisieren, Löschen und Löschen von Waisenkindern)

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 Set getStockDailyRecords() {
        return this.stockDailyRecords;
    }

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.