Hibernate –動的更新属性の例
動的更新とは
dynamic-update属性は、SQL UPDATEステートメントに変更されていないプロパティを含めるかどうかをHibernateに指示します。
動的更新の例
1. dynamic-update = false
dynamic-updateのデフォルト値はfalseです。これは、HibernateのSQL更新ステートメントのinclude unmodified propertiesを意味します。
たとえば、オブジェクトを取得し、その値を変更して更新します。
Query q = session.createQuery("from StockTransaction where tranId = :tranId ");
q.setParameter("tranId", 11);
StockTransaction stockTran = (StockTransaction)q.list().get(0);
stockTran.setVolume(4000000L);
session.update(stockTran);
Hibernateは次の更新SQLステートメントを生成します。
Hibernate:
update
example.stock_transaction
set
DATE=?,
PRICE_CHANGE=?,
PRICE_CLOSE=?,
PRICE_OPEN=?,
STOCK_ID=?,
VOLUME=?
where
TRAN_ID=?
Hibernateは変更されていないすべての列を更新します。
2. dynamic-update = true
dynamic-insertをtrueに設定した場合、これはHibernateのSQL更新ステートメントのexclude unmodified propertiesを意味します。
たとえば、オブジェクトを取得し、その値を変更して再度更新してみます。
Query q = session.createQuery("from StockTransaction where tranId = :tranId ");
q.setParameter("tranId", 11);
StockTransaction stockTran = (StockTransaction)q.list().get(0);
stockTran.setVolume(4000000L);
session.update(stockTran);
Hibernateは異なる更新SQLステートメントを生成します。
Hibernate:
update
example.stock_transaction
set
VOLUME=?
where
TRAN_ID=?
Hibernateは変更された列のみを更新します。
Performance issue
多数の列がある大きなテーブル(レガシー設計)または大きなデータボリュームを含む場合、変更されていない列の更新はまったく不要であり、システムパフォーマンスに大きな影響を与えます。
構成方法
注釈またはXMLマッピングファイルを介して「dynamic-update」プロパティを構成できます。
1. アノテーション
@Entity
@Table(name = "stock_transaction", catalog = "example")
@org.hibernate.annotations.Entity(
dynamicUpdate = true
)
public class StockTransaction implements java.io.Serializable {
2. XMLマッピング
結論
この小さな「dynamic-update」の調整により、システムパフォーマンスが確実に向上するため、これを行うことを強くお勧めします。
ファローアップ
1. 休止状態–dynamic-insert attributeの例