6

我在我的 Spring webapp 中使用 JPA 和 Hibernate 作为实现。

我使用EntityListeners 进行审计(Spring-data)和其他通知目的。一般来说,它工作正常。但是,当对多对多集合/关系进行更改时,如果不对实体本身的任何字段进行任何其他更改,则不会触发 s的@PostUpdate事件。EventListener

举一个具体的例子:我有一个User和一个Role实体,它们之间具有多对多关系,使用基础表。如果我转到我的用户管理 GUI,并向用户添加(或删除)角色,而不更改任何其他内容,则不会触发“postUpdate”事件,也不会修改审核信息。

它有一些逻辑(在低级别),因为用户或角色表都没有更新,只有关系表。然而,关系本身并未建模为实体类,因此不可能对其应用审计,至少在 JPA 级别上是不可能的,因此触发实体本身的更改事件是有意义的。

这是正常的 JPA 行为,还是 Hibernate 特有的?有什么解决方法吗?你会做什么来触发这个事件?想法?

注意:我发现很少提到这个限制,甚至更少的解决方案: 这个 SO question(没有有用的答案)和Hibernate 论坛上的这篇文章也没有任何答案。

4

1 回答 1

5

JPA 规范对触发拥有它们的实体上的更新前/更新后回调的集合的更改非常不清楚。不清楚,我的意思是完全沉默。事实上,IMO 规范中的措辞暗示不应发生回调,因为前/后更新应该发生在为该实体发送 SQL UPDATE 语句之前/之后。

现在,如果拥有实体是版本控制的,Hibernate 将对其拥有的任何集合(实际上是任何属性)的更改视为强制拥有实体的版本增量,这将触发实体的更新,进而触发更新后回调。

于 2013-06-12T19:06:17.800 回答