HibernateでJPAを使用しています。オブジェクトの1つの属性を変更して更新すると、生成されたSQLは、すべての列が更新されていることを示しています。変更された列のみを更新しないのはなぜですか?それがより最適化されると思うので、それを達成する方法はありますか?
2 に答える
デフォルトでは、休止状態には更新クエリのすべてのフィールドが含まれます。これを除外する場合は、カスタム更新HQLを使用するか、この記事で説明されているように、更新クエリの変更されていないフィールドを除外するようにHibernateを構成できます。
これはdynamic-update="true"
、クラスマッピングを追加することによって行われます。
<class ... table="your_table" .... dynamic-update="true">
多くの列がある大きなテーブル(レガシーデザイン)または大量のデータが含まれている場合、これはシステムパフォーマンスに大きな影響を与えます。ここで説明するように、パフォーマンスにいくらかの影響を与える可能性があります。したがって、コードを実装する前に、コードのパフォーマンスを測定してください。
詳細については、こちらのAPIをお読みください。
注釈を使用している場合は、
@org.hibernate.annotations.Entity(selectBeforeUpdate=true)
これは休止状態固有のアノテーションであり、JPAでは使用できません。詳細にリンクしている良い記事があります。
私は過去4-5日間問題を抱えていたので、ゆっくりと私を怒らせていました。
削除操作では、主キー列だけでなくすべての列を使用していました。
例えば。
DELETE FROM MYTABLE WHERE ID=? AND NAME=? AND VALUE=?
「dynamicUpdate=true」アノテーションを削除すると、Hibernateは正しいSQLの生成を開始しました。
DELETE FROM MYTABLE WHERE ID=?
VALUE
CLOBの場合、Oracle11gで厄介な問題が発生していました。