Hibernate –動的挿入属性の例
動的挿入とは
dynamic-insert属性は、SQL INSERTステートメントにnullプロパティを含めるかどうかをHibernateに指示します。 それをより明確に理解するために、いくつかの例を探検しましょう。
動的挿入の例
1. dynamic-insert = false
dynamic-insertのデフォルト値はfalseです。これは、HibernateのSQL INSERTステートメントのinclude null propertiesを意味します。
たとえば、オブジェクトプロパティにnull値を設定して保存してみてください。
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);
Hibernateの「show_sql」をtrueに設定すると、次の挿入SQLステートメントが表示されます。
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)。
2. dynamic-insert = true
dynamic-insertをtrueに設定した場合、これはHibernateのSQL INSERTステートメントのexclude null property valuesを意味します。
たとえば、オブジェクトプロパティにいくつかのnull値を設定して、もう一度保存してみてください。
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);
Hibernateの「show_sql」をtrueに設定します。 別の挿入SQLステートメントが表示されます。
Hibernate: insert into example.stock_transaction (DATE, STOCK_ID, VOLUME) values (?, ?, ?)
挿入のHibernate will generate only the necessary columns(DATE、STOCK_ID、VOLUME)。
パフォーマンスの問題
数百の列を持つ非常に大きなテーブル(レガシーデザイン)、またはテーブルに非常に大きなデータボリュームが含まれる場合など、特定の状況では、不要なものを挿入するとシステムパフォーマンスが低下します。
構成方法
アノテーションまたはXMLマッピングファイルを使用して、動的挿入プロパティの値を構成できます。
1. アノテーション
@Entity @Table(name = "stock_transaction", catalog = "example") @org.hibernate.annotations.Entity( dynamicInsert = true ) public class StockTransaction implements java.io.Serializable {
2. XMLマッピング
結論
この小さな「dynamic-insert」の調整により、システムパフォーマンスが向上する可能性があるため、これを行うことを強くお勧めします。 しかし、私の心の中の1つの質問は、Hibernateがデフォルトでfalseに設定する理由です。
ファローアップ
1. 休止状態–dynamic-update attributeの例