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の例