Veränderbare Beispiele für den Ruhezustand (Klasse und Sammlung)

Beispiel für den Ruhezustand (Klasse und Sammlung)

Im Ruhezustand ist "mutable" in der Klasse und der zugehörigen Sammlung standardmäßig "true". Dies bedeutet, dass die Klasse oder Sammlung hinzugefügt, aktualisiert und gelöscht werden darf. Wenn die Variable dagegen in false geändert wird, hat sie in der Klasse und der zugehörigen Auflistung eine andere Bedeutung. Nehmen wir einige Beispiele, um mehr darüber zu erfahren.

Hibernate eins zu viele Beispiel

Ich werde dieseone-to-many example für die veränderliche Demonstration nehmen. In dieser Zuordnungsdatei gehört ein Bestand zu vielen StockDailyRecord.

...

    
        
            
                
            
            
        
    
...

Wie kann man sich für veränderlich erklären?

Die ‘Mutable’ wird sowohl in XML-Zuordnungsdateien als auch in Anmerkungen unterstützt.

1. XML-Zuordnungsdatei

In der Zuordnungsdatei wird das Schlüsselwort 'mutable' verwendet, um die veränderbare Funktion zu implementieren.

...

    
        
            
                
            
            
        
    
...

2. Anmerkung

In der Anmerkung wird das Schlüsselwort in "@Immutable" geändert (mutable = "false").

...
@Entity
@Immutable
@Table(name = "stock", catalog = "example")
public class Stock implements java.io.Serializable {
...
        @OneToMany(fetch = FetchType.LAZY, mappedBy = "stock")
    @Immutable
    public Set getStockDailyRecords() {
        return this.stockDailyRecords;
    }
...

In der Klasse veränderbar

Wenn mutable = "false" oder @Immutable im Klassenelement deklariert ist, bedeutet diesupdates to this class will be ignored, but no exception is thrown, only the add and delete operation are allow.

1. Test einfügen

Stock stock = new Stock();
stock.setStockCode("7277");
stock.setStockName("DIALOG");
session.save(stock);

Wenn veränderlich = "wahr" (Standard) oder kein @Immutable in der Klasse deklariert ist.
Output

Hibernate:
    insert into example.stock (STOCK_CODE, STOCK_NAME)
    values (?, ?)

wenn mutable = "false" oder @Immutable in der Klasse deklariert ist.
Output

Hibernate:
    insert into example.stock (STOCK_CODE, STOCK_NAME)
    values (?, ?)

In der Klasse veränderbar hat keine Auswirkung auf die Einfügeoperation.

2. Update testen

Stock stock = (Stock)session.createQuery(
      " from Stock where stockCode = '7277'").list().get(0);
stock.setStockName("DIALOG123");
session.saveOrUpdate(stock);

wenn veränderlich = "wahr" oder kein @Immutable in der Klasse deklariert ist.
Output

Hibernate:
    select ...from example.stock stock0_
    where stock0_.STOCK_CODE='7277'

Hibernate:
    update example.stock
    set STOCK_CODE=?,STOCK_NAME=?
    where STOCK_ID=?

wenn mutable = "false" oder @Immutable in der Klasse deklariert ist.
Output

Hibernate:
    select ...from example.stock stock0_
    where stock0_.STOCK_CODE='7277'

In der Klasse veränderbar ist es der Anwendung nicht möglich, sie zu aktualisieren. Der Vorgang "Aktualisieren" wird ignoriert und es wird keine Ausnahme ausgelöst

3. Test löschen

Stock stock = (Stock)session.createQuery(
      " from Stock where stockCode = '7277'").list().get(0);
session.delete(stock);

Wenn veränderlich = "wahr" (Standard) oder kein @Immutable in der Klasse deklariert ist.
Output

Hibernate:
    delete from example.stock
    where STOCK_ID=?

wenn mutable = "false" oder @Immutable in der Klasse deklariert ist.
Output

Hibernate:
    delete from example.stock
    where STOCK_ID=?

In der Klasse veränderbar hat keine Auswirkung auf die Löschoperation.

In Sammlung veränderbar

Wenn mutable = "false" oder @Immutable in der Sammlung deklariert ist, bedeutet diesadd and delete-orphan are not allow in this collection, with exception throw, only update and ‘cascade delete all’ are allow.

1. Test einfügen

Angenommen, die Kaskadeneinfügung ist aktiviert.

Stock stock = (Stock)session.createQuery(
      " from Stock where stockCode = '7277'").list().get(0);
StockDailyRecord sdr = new StockDailyRecord();
sdr.setDate(new Date());
sdr.setStock(stock);
stock.getStockDailyRecords().add(sdr);
session.save(stock);

Wenn mutable = "true" (Standard) oder kein @Immutable in der Sammlung deklariert ist.
Output

Hibernate:
    insert into example.stock_daily_record
    (STOCK_ID, PRICE_OPEN, PRICE_CLOSE, PRICE_CHANGE, VOLUME, DATE)
    values (?, ?, ?, ?, ?, ?)

Wenn mutable = "false" oder @Immutable in der Sammlung deklariert ist.
Output

Exception in thread "main" org.hibernate.HibernateException:
changed an immutable collection instance:
[com.example.common.Stock.stockDailyRecords#111]

In der Sammlung veränderbar ist die Operation "Hinzufügen" nicht zulässig, eine Ausnahme wird ausgelöst.

2. Update testen

Angenommen, die Kaskadenaktualisierung ist aktiviert.

Stock stock = (Stock)session.createQuery(
      " from Stock where stockCode = '7277'").list().get(0);
StockDailyRecord sdr = stock.getStockDailyRecords().iterator().next();
sdr.setPriceChange(new Float(1.30));
session.saveOrUpdate(stock);

Wenn mutable = "true" (Standard) oder kein @Immutable in der Sammlung deklariert ist.
Output

Hibernate:
    update example.stock_daily_record
    set PRICE_CHANGE=?, ...
    where DAILY_RECORD_ID=?

Wenn mutable = "false" oder @Immutable in der Sammlung deklariert ist.
Output

Hibernate:
    update example.stock_daily_record
    set PRICE_CHANGE=?, ...
    where DAILY_RECORD_ID=?

In der Sammlung veränderbar hat keine Auswirkung auf den Aktualisierungsvorgang.

3. Teste delete-orphan

Angenommen,cascade delete-orphan ist aktiviert.

Stock stock = (Stock)session.createQuery(
      " from Stock where stockCode = '7277'").list().get(0);
StockDailyRecord sdr = stock.getStockDailyRecords().iterator().next();
stock.getStockDailyRecords().remove(sdr);
session.saveOrUpdate(stock);

Wenn mutable = "true" (Standard) oder kein @Immutable in der Sammlung deklariert ist.
Output

Hibernate:
    delete from example.stock_daily_record
    where DAILY_RECORD_ID=?

Wenn mutable = "false" oder @Immutable in der Sammlung deklariert ist.
Output

Exception in thread "main" org.hibernate.HibernateException:
changed an immutable collection instance:
[com.example.common.Stock.stockDailyRecords#111]

In der Sammlung veränderbar ist die Operation "Orphan löschen" nicht zulässig. Eine Ausnahme wird ausgelöst.

4. Test löschen

Angenommen, die Kaskadenlöschung ist aktiviert.

Stock stock = (Stock)session.createQuery(
      " from Stock where stockCode = '7277'").list().get(0);
session.saveOrUpdate(stock);

Wenn mutable = "true" (Standard) oder kein @Immutable in der Sammlung deklariert ist.
Output

Hibernate:
    delete from example.stock_daily_record
    where DAILY_RECORD_ID=?

Hibernate:
    delete from example.stock
    where STOCK_ID=?

Wenn mutable = "false" oder @Immutable in der Sammlung deklariert ist.
Output

Hibernate:
    delete from example.stock_daily_record
    where DAILY_RECORD_ID=?

Hibernate:
    delete from example.stock
    where STOCK_ID=?

In der Sammlung veränderbar hat keine Auswirkung auf den Vorgang "Löschen". Wenn das übergeordnete Element gelöscht wird, wird auch das gesamte untergeordnete Element gelöscht, auch wenn es veränderbar ist.

Warum veränderlich?

Mutable kann viele unbeabsichtigte Datenbankoperationen vermeiden, z. B. das Hinzufügen, Aktualisieren oder Löschen einiger Datensätze, die nicht vorhanden sein sollten. Laut der Hibernate-Dokumentation weist das mutable-Do einige geringfügige Leistungsoptimierungen auf. Es wird daher immer empfohlen, Ihre Mapping-Beziehung zu analysieren und das mutable nach Bedarf zu implementieren.

Zusammenfassung

1. mutable = "false" oder @Immutable wird in der Klasse deklariert

Dies bedeutet, dass die Aktualisierungen dieser Klasse ignoriert werden. Es wird jedoch keine Ausnahme ausgelöst, sondern nur das Hinzufügen und Löschen zugelassen.

In Klasse mit veränderlichem Wert = "falsch" - Einfügen = zulassen, Löschen = zulassen, Aktualisieren = nicht zulassen

2. mutable = "false" oder @Immutable wird in der Sammlung deklariert

es bedeutet, dass das Hinzufügen und Löschen von Waisen in dieser Sammlung nicht zulässig ist, mit Ausnahme von throw, nur update erlauben. Wenn jedoch die Kaskadenlöschung aktiviert ist, werden beim Löschen des übergeordneten Elements auch alle untergeordneten Elemente gelöscht, auch wenn sie veränderbar sind.

In Sammlung mit veränderlichem Wert = "falsch" - Einfügen = nicht zulassen, Löschen-verwaist = nicht zulassen, Löschen = zulassen, Aktualisieren = zulassen

Völlig unveränderlich?

Kann eine Klasse für irgendwelche Aktionen völlig unveränderlich sein? Ja, setzen Sie ein mutable = "false" für alle Beziehungen (insert = nicht zulassen, delete-orphan = nicht zulassen) und ein mutable = "false" für die Klasse, die Sie unveränderlich machen möchten (update = nicht zulassen). Jetzt haben Sie eine vollständig unveränderbare Klasse. Wenn jedoch die Option zum Kaskadenlöschen aktiviert ist und das übergeordnete Element Ihrer unveränderlichen Klasse gelöscht wird, wird auch Ihre unveränderliche Klasse gelöscht.