Hibernate – 動的更新属性の例
動的更新とは
dynamic-update属性は、SQL UPDATE文に未変更のプロパティを含めるかどうかをHibernateに伝えます。
動的更新の例
1. dynamic-update = false
dynamic-updateのデフォルト値はfalseです。つまり、HibernateのSQL更新ステートメントに
変更されていないプロパティ
を含みます。
たとえば、オブジェクトを取得し、その値を変更して更新しようとします。
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
mkyong.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更新ステートメントで変更されていないプロパティ** が除外されます。
たとえば、オブジェクトを取得し、その値を変更して再度更新します。
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
mkyong.stock__transaction
set
VOLUME=?
where
TRAN__ID=?
Hibernateは変更された列のみを更新します。
それを設定する方法
アノテーションまたはXMLマッピングファイルを介して “` `dynamic-update`”プロパティを設定することができます。
1.注釈
@Entity
@Table(name = "stock__transaction", catalog = "mkyong")
@org.hibernate.annotations.Entity(
dynamicUpdate = true
)
public class StockTransaction implements java.io.Serializable {
2. XMLマッピング
<class ... table="stock__transaction" catalog="mkyong" dynamic-update="true">
<id name="tranId" type="java.lang.Integer">
<column name="TRAN__ID"/>
<generator class="identity"/>
</id>
結論
この小さな ”
dynamic-update
“調整は、システムのパフォーマンスを確実に向上させ、それを行うことを強く推奨します。