1

最後に変更された属性を持つエンティティがあります。

@Temporal(TemporalType.TIMESTAMP)
private Date lastModified;

@PreUpdate
@PrePersist
protected void onUpdate() {
    lastModified = new Date();
}

古いエンティティのいくつかの属性を設定する名前付き jpql 更新クエリ:

update entity e set ... where e.lastModified < :threshold

ただし、 onUpdate() メソッドは、変更されていないエンティティに対しても呼び出されます。これは、次の場合のイベントです。

entityManager.createQuery("...").executeUpdate();

更新されたエンティティの数としてゼロを返します。

最近のエンティティに触れずに、古いエンティティのみを更新できますか? 更新されたエンティティではしきい値パラメーターが不明なため、更新を onUpdate() メソッドに移動できません。ネイティブクエリはこれに役立ちますか?

4

2 に答える 2

1

申し訳ありませんが、それは私のjunitテストでの私のせいでした。onUpdate() は、一括更新中にはまったく呼び出されません (変更されたエンティティの場合でも)。最初の選択まで他の更新が遅れていることに混乱しました。

@Version に関するドキュメントをさらに読んだ後、Gab が提案したように、一括更新 (jpql を使用) がエンティティ マネージャーをバイパスし、同じことが PreUpdate リスナーにも当てはまることがわかりました。したがって、問題は更新コードではなく、テストにありました。

于 2013-05-21T12:57:34.817 に答える