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
“調整は、システムのパフォーマンスを確実に向上させ、それを行うことを強く推奨します。