没有调用JPA EventListener方法更改为多对多集合?

Pie*_*nry 3 many-to-many hibernate jpa entitylisteners

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

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

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

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

这是正常的JPA行为,还是特定于Hibernate?有没有解决方法?你会怎么做才能触发这个事件?想法?

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

Ste*_*ole 5

JPA规范非常不清楚集合的变化是否会触发拥有它们的实体的更新前/后更新回调.而且不清楚,我的意思是完全沉默.实际上,IMO中规范中的措辞意味着回调不应该发生,因为更新前/后应该发生在为该实体发送SQL UPDATE语句之前/之后.

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

  • @PierreHenry,如果它有一个用 [javax.persistence.Version](http://docs.oracle.com/javaee/7/api/javax/persistence/Version.html) 注释注释的字段。该字段用于检查实体上的更改。 (2认同)