2

HibernateでJPAを使用しています。オブジェクトの1つの属性を変更して更新すると、生成されたSQLは、すべての列が更新されていることを示しています。変更された列のみを更新しないのはなぜですか?それがより最適化されると思うので、それを達成する方法はありますか?

4

2 に答える 2

5

デフォルトでは、休止状態には更新クエリのすべてのフィールドが含まれます。これを除外する場合は、カスタム更新HQLを使用するか、この記事で説明されているように、更新クエリの変更されていないフィールドを除外するようにHibernateを構成できます。

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

<class ... table="your_table" .... dynamic-update="true">

多くの列がある大きなテーブル(レガシーデザイン)または大量のデータが含まれている場合、これはシステムパフォーマンスに大きな影響を与えます。ここで説明するように、パフォーマンスにいくらかの影響を与える可能性があります。したがって、コードを実装する前に、コードのパフォーマンスを測定してください。

詳細については、こちらのAPIをお読みください。

注釈を使用している場合は、

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

これは休止状態固有のアノテーションであり、JPAでは使用できません。詳細にリンクしている良い記事があります。

于 2012-04-25T12:20:53.927 に答える
1

私は過去4-5日間問題を抱えていたので、ゆっくりと私を怒らせていました。

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

例えば。

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

「dynamicUpdate=true」アノテーションを削除すると、Hibernateは正しいSQLの生成を開始しました。

DELETE FROM MYTABLE WHERE ID=?

VALUECLOBの場合、Oracle11gで厄介な問題が発生していました。

于 2012-08-03T11:38:49.210 に答える