JPAをHibernateで使用しています。オブジェクトの1つの属性を変更して更新すると、生成されたSQLは、更新されているすべての列を表示します。なぜそれは変更された列だけを更新しないのですか?私はそれがより最適化されると思うので、それを達成する方法はありますか?JPA Hibernateの更新クエリではなぜですか?すべての属性がSQLで更新されます
1
A
答えて
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
私はゆっくりと私を怒らせていた最後の4-5日間問題がありました。
削除操作では、主キー列だけでなくすべての列が使用されていました。
例:
DELETE FROM MYTABLE WHERE ID=? AND NAME=? AND VALUE=?
私は "dynamicUpdate = true" の注釈を削除
は、Hibernateはすなわち、右のSQLを生成し始めました。DELETE FROM MYTABLE WHERE ID=?
それはVALUE
がCLOBたとき、Oracle 11gの上の厄介な問題を引き起こしていました。
これは、休止状態を使用している場合のみ正常に動作します。しかし、私はJPAを使用しているので、私はpersistence.xmlのみを使用し、hibernate.propertiesは使用しません。私はpersistence.xml内のすべての宣言を com.kids.domain.Child のように作成します。このフラグを使用することはできません。 –
Deepak
@Deepak:遅れて申し訳ありませんが、詳細を使って回答を更新しました。 – ManuPK
私はHibernateチームがデフォルトですべての列を更新することを選択したのは不思議です –