【发布时间】:2018-12-02 17:01:04
【问题描述】:
我想手动更新由 Hibernate Envers 在同一事务中生成和填充的 AUD 表的记录。 遗憾的是,我没有发现我可以收听的 JPA 或 Envers 事件,我就在提交 JPA 事务之前,但 AUD 表已经填充。
你知道我该怎么做吗?
我正在使用 Spring Boot 2.0.2、Hibernate 5.2.17、Envers 5.2.16
编辑(使用拦截器的解决方案)
可以从org.hibernate.EmptyInterceptor 扩展并覆盖方法beforeTransactionCompletion。在 Spring Boot 的application.properties 中,您必须使用
spring.jpa.properties.hibernate.ejb.interceptor=com.example.CustomInterceptor
缺点:您失去了与被审计实体的联系。在这种方法中,您只能使用休眠事务。
编辑 II(使用 AuditStrategy 的解决方案)
扩展org.hibernate.envers.strategy.DefaultAuditStrategy,覆盖perform-方法并修改data-数组。该数组未绑定到 JPA,因此可以在 JPA 未知的列中插入额外的数据。
在 application.properties 中注册您的自定义 AuditStrategy
spring.jpa.properties.org.hibernate.envers.audit_strategy=com.example.CustomAuditStrategy
【问题讨论】:
-
这不是我们支持的。这个想法是,您的审计表应该是给定时间点实体状态的镜像,并允许用户代码操作和更改使该前提无效的操作。也许如果你能澄清你想要完成的事情,可能会有更好的方法来支持它。
-
我找到了解决方案。请查看更新后的问题。
-
当然有很多方法可以注入到流程中,但在推荐一些东西之前,我想了解一下目的。例如是因为如果仅修改了某些状态,您想否决或阻止对某个字段进行审计?这些是受支持但通过其他方式支持的东西。在错误的地方处理审计数据可能会导致不一致,虽然它可能适用于记录审计条目,但如果操作不正确,可能会在查询时导致长期问题。
标签: hibernate spring-boot spring-data-jpa hibernate-envers