2012-04-25 11 views

答えて

5

デフォルトでは、hibernateには更新クエリのすべてのフィールドが含まれます。これを除外したい場合は、カスタムアップデートHQLを使用するか、hibernateをに設定して、このarticleのように更新クエリの変更されていないフィールドを除外することができます。

これは、クラスマッピングにdynamic-update="true"を追加することによって行われます。

多くの列(従来のデザイン)を持つ大規模なテーブルで
<class ... table="your_table" .... dynamic-update="true"> 

または大量のデータが含まれ、これはシステムのパフォーマンスに大きな影響を持つことになります。 hereのようにパフォーマンスに影響を与える可能性があります。したがって、実装する前にコードのパフォーマンスを測定してください。

詳細については、hereをご覧ください。

アノテーションを使用している場合は、

@org.hibernate.annotations.Entity(selectBeforeUpdate=true) 

それは休止状態、特定のアノテーション、JPAでは使用できません。ここには、詳細にリンクする良いarticleがあります。

+0

これは、休止状態を使用している場合のみ正常に動作します。しかし、私はJPAを使用しているので、私はpersistence.xmlのみを使用し、hibernate.propertiesは使用しません。私はpersistence.xml内のすべての宣言を com.kids.domain.Childのように作成します。このフラグを使用することはできません。 – Deepak

+0

@Deepak:遅れて申し訳ありませんが、詳細を使って回答を更新しました。 – ManuPK

+0

私はHibernateチームがデフォルトですべての列を更新することを選択したのは不思議です –

0

私はゆっくりと私を怒らせていた最後の4-5日間問題がありました。

削除操作では、主キー列だけでなくすべての列が使用されていました。

例:

DELETE FROM MYTABLE WHERE ID=? AND NAME=? AND VALUE=? 

私は "dynamicUpdate = true" の注釈を削除

は、Hibernateはすなわち、右のSQLを生成し始めました。

DELETE FROM MYTABLE WHERE ID=? 

それはVALUEがCLOBたとき、Oracle 11gの上の厄介な問題を引き起こしていました。