Ruhezustand - Beispiel für dynamisches Einfügen von Attributen

Ruhezustand - Beispiel für ein Attribut mit dynamischer Einfügung

Was ist Dynamic-Insert?

Das Attribut dynamic-insert teilt Hibernate mit, ob Null-Eigenschaften in die SQL-Anweisung INSERT aufgenommen werden sollen. Schauen wir uns einige Beispiele an, um dies besser zu verstehen.

Beispiel für dynamisches Einfügen

1. dynamic-insert = false

Der Standardwert für dynamic-insert ist false. Dies bedeutetinclude null properties in der SQL INSERT-Anweisung des Ruhezustands.

Versuchen Sie beispielsweise, einige Nullwerte für Objekteigenschaften festzulegen und zu speichern.

        StockTransaction stockTran = new StockTransaction();
        //stockTran.setPriceOpen(new Float("1.2"));
        //stockTran.setPriceClose(new Float("1.1"));
        //stockTran.setPriceChange(new Float("10.0"));
        stockTran.setVolume(2000000L);
        stockTran.setDate(new Date());
        stockTran.setStock(stock);

        session.save(stockTran);

Wenn Sie den Ruhezustand "show_sql" auf "true" schalten, wird die folgende SQL-Anweisung "insert" angezeigt.

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

Hibernate will generate the unnecessary columns (PRICE_CHANGE, PRICE_CLOSE, PRICE_OPEN) für das Einfügen.

2. dynamic-insert = true

Wenn Sie die dynamische Einfügung auf true setzen, bedeutet diesexclude null property values in der SQL INSERT-Anweisung des Ruhezustands.

Versuchen Sie beispielsweise, einige Nullwerte für Objekteigenschaften festzulegen und erneut zu speichern.

        StockTransaction stockTran = new StockTransaction();
        //stockTran.setPriceOpen(new Float("1.2"));
        //stockTran.setPriceClose(new Float("1.1"));
        //stockTran.setPriceChange(new Float("10.0"));
        stockTran.setVolume(2000000L);
        stockTran.setDate(new Date());
        stockTran.setStock(stock);

        session.save(stockTran);

Schalten Sie den Ruhezustand "show_sql" auf "true". Sie sehen die verschiedenen SQL-Anweisungen zum Einfügen.

Hibernate:
    insert
    into
        example.stock_transaction
        (DATE, STOCK_ID, VOLUME)
    values
        (?, ?, ?)

Hibernate will generate only the necessary columns (DATE, STOCK_ID, VOLUME) für das Einfügen.

Leistungsproblem

In bestimmten Situationen, z. B. bei einer sehr großen Tabelle mit Hunderten von Spalten (altes Design) oder bei einer Tabelle mit extrem großem Datenvolumen, kann das Einfügen von nicht unbedingt erforderlichen Elementen die Systemleistung beeinträchtigen.

So konfigurieren Sie es

Sie können den Eigenschaftswert für dynamisches Einfügen über eine Annotations- oder XML-Zuordnungsdatei konfigurieren.

1. Anmerkung

@Entity
@Table(name = "stock_transaction", catalog = "example")
@org.hibernate.annotations.Entity(
        dynamicInsert = true
)
public class StockTransaction implements java.io.Serializable {

2. XML-Zuordnung


        
            
            
        

Fazit

Diese kleine Optimierung von „dynamic-insert“ kann die Systemleistung steigern und empfiehlt dringend, dies zu tun. Eine meiner Fragen ist jedoch, warum Hibernate es standardmäßig auf false gesetzt hat.

Nachverfolgen

1. Beispiel für Ruhezustand -dynamic-update attribute