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