Hibernate – 動的挿入属性の例
動的挿入とは
dynamic-insert属性は、SQL INSERT文にnullプロパティを含めるかどうかをHibernateに指示します。それについてより明確に理解するためのいくつかの例を探そう。
動的挿入の例
1. dynamic-insert = false
dynamic-insertのデフォルト値はfalseです。つまり、HibernateのSQL INSERT文に
のnullプロパティ
があることを意味します。
たとえば、オブジェクトのプロパティにいくつかの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にすると、次のinsert SQL文が表示されます。
Hibernate:
insert
into
mkyong.stock__transaction
(DATE, PRICE__CHANGE, PRICE__CLOSE, PRICE__OPEN, STOCK__ID, VOLUME)
values
(?, ?, ?, ?, ?, ?)
2. dynamic-insert = true
dynamic-insertをtrueに設定すると、HibernateのSQL INSERT文で
nullプロパティ値
を除外します。
たとえば、オブジェクトのプロパティにいくつかの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);
休止状態の “show__sql”をtrueにします。別の挿入SQL文が表示されます。
Hibernate:
insert
into
mkyong.stock__transaction
(DATE, STOCK__ID, VOLUME)
values
(?, ?, ?)
-
Hibernateは、挿入に必要な列** (DATE、STOCK__ID、VOLUME)のみを生成します。
パフォーマンスの問題
数百もの列(レガシー設計)の非常に大きなテーブルやテーブルには非常に大きなデータ量が含まれているなど、特定の状況では、必要のないものを挿入するとシステムのパフォーマンスが低下します。
それを設定する方法
注釈またはXMLマッピングファイルを使用して動的挿入プロパティ値を設定できます。
1.注釈
@Entity
@Table(name = "stock__transaction", catalog = "mkyong")
@org.hibernate.annotations.Entity(
dynamicInsert = true
)
public class StockTransaction implements java.io.Serializable {
2. XMLマッピング
<class ... table="stock__transaction" catalog="mkyong" dynamic-insert="true">
<id name="tranId" type="java.lang.Integer">
<column name="TRAN__ID"/>
<generator class="identity"/>
</id>
結論
この小さな ”
dynamic-insert
“の調整は、システムのパフォーマンスを向上させる可能性があり、それを行うことを強くお勧めします。しかし、私の心の1つの質問は、Hibernateがデフォルトでfalseに設定した理由です。