Hibernate - 動的更新属性の例

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