我有一个数据库,其中一个实体(比如,用户)有一个实体列表(比如,列表)。作为一项要求,我必须对列表中的实体进行非规范化计数:
@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已经确定它不必担心用户,因此它不会更新用户。
这个推理正确吗?
如果是这样,我怎样才能正确地实现这一目标?
谢谢,布鲁诺