エンティティ(ユーザーなど)がエンティティのリスト(リストなど)を持つデータベースがあります。要件として、リスト上のエンティティの非正規化された数が必要です。
@Entity
class User {
/* ... */
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<Friendship> friends;
public int friendsCount;
/* ... */
}
リストに新しい要素を追加するときは、トランザクション的に、対応するカウンターを増やす必要があります。
私はEntityListenerを使用してそうしようとしました:
class MyBrokenEntityListener {
@PostPersist
public void incrementCounter(Friendship friendship) {
friendship.getUser1().incrementFriendsCount();
}
}
エンティティ リスナーは正しく呼び出されており、デバッグ中にエンティティが正しく変更されていることがわかります。ただし、Hibernate は UPDATE クエリをデータベースに送信せず、INSERT クエリのみを送信します (Friendship エンティティに対応)。
EntityListener でさまざまなイベントを試しましたが、うまくいかないようです。
ここで起こっていると思われるのは、エンティティ リスナーがユーザーへの更新によってトリガーされるということです。次に、List だけで構成されるユーザーのすべてのダーティ プロパティを識別します。したがって、ユーザーとは関係なく、フレンドシップを挿入するだけです。次に、操作をフレンドシップにカスケードします。エンティティ リスナーが呼び出され、ユーザーが変更されますが、この時点で Hibernate はユーザーを気にする必要がないと既に判断しているため、ユーザーを更新しません。
この推論は正しいですか?
もしそうなら、どうすればこれを適切に達成できますか?
ありがとう、ブルーノ