Hibernateで変更のあった列だけ更新する

こんにちは、平田です。

Hibernateのアノテーション @DynamicUpdate を使って変更のあった列だけを更新します。

JPAでは、永続化されたエンティティのフィールドを変更するとトランザクションコミット時にUPDATE文が発行されます。このとき、変更してないものも含むすべてのフィールドを対象としたUPDATE文が発行されますが、Hibernateの Dynamic Update 機能を使うと変更のあったフィールドのみを対象としたUPDATE文を発行できます。

Quarkusサンプル集のhibernate-orm-quickstartのエンティティに登録日時フィールドを追加します(ちなみにSpring Data JPAでも動作します)。

public class Fruit {
  ...
  private Date createdAt;

この状態で mvn clean quarkus:dev で起動してHTTP PUTすると、以下のUPDATE文がログに流れます。フルーツの名前のみ変更しても、常にcreatedAtフィールドもUPDATE文の対象となります。createdAtには変更前にフェッチした値がそのまま入るため、フェッチから更新するまでにバックグラウンドで変更されない限り値は変わりません。

Hibernate:
    update
        known_fruits
    set
        createdAt=?,
        name=?
    where
        id=?

次に @DynamicUpdate アノテーションをつけてみます。

...
import org.hibernate.annotations.DynamicUpdate;

@Entity
...
@DynamicUpdate
public class Fruit {

この状態でアプリを再起動してHTTP PUTすると、以下のUPDATE文がログに出力されます。

Hibernate:
    update
        known_fruits
    set
        name=?
    where
        id=?

変更したnameのみを対象としたUPDATE文になっています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です