Spring Boot 和 Hibernate Envers:手动更新 AUD-Table

Posted

技术标签:

【中文标题】Spring Boot 和 Hibernate Envers:手动更新 AUD-Table【英文标题】:Spring Boot and Hibernate Envers: Manually updating AUD-Table 【发布时间】: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

【问题讨论】:

这不是我们支持的。这个想法是,您的审计表应该是给定时间点实体状态的镜像,并允许用户代码操作和更改使该前提无效的操作。也许如果你能澄清你想要完成的事情,可能会有更好的方法来支持它。 我找到了解决方案。请查看更新后的问题。 当然有很多方法可以注入到流程中,但在推荐一些东西之前,我想了解一下目的。例如是因为如果仅修改了某些状态,您想否决或阻止对某个字段进行审计?这些是受支持但通过其他方式支持的东西。在错误的地方处理审计数据可能会导致不一致,虽然它可能适用于记录审计条目,但如果操作不正确,可能会在查询时导致长期问题。 【参考方案1】:

自 Hibernate 版本 5.4.0 以来,此问题已得到修复。现在 AuditStrategies 更加灵活和模块化。

见:https://hibernate.atlassian.net/browse/HHH-13051

【讨论】:

以上是关于Spring Boot 和 Hibernate Envers:手动更新 AUD-Table的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate 和 CRUDRepository Spring Boot

Spring Boot 和 Hibernate:打印/记录 DDL

如何使用 Hibernate 和 Spring Boot 配置和监控 HikariCP

当实体自引用时,Spring Boot 和 Hibernate 无法自动创建表

使用 Spring Boot、Jackson 和 Hibernate 的多对多关系

Spring boot、mvc、hibernate 和 mysql 配置 - sessionFactory 错误