こんにちは、平田です。
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文になっています。