【问题标题】:Spring Boot and Hibernate Envers: Manually updating AUD-TableSpring Boot 和 Hibernate Envers:手动更新 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

【问题讨论】:

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

标签: hibernate spring-boot spring-data-jpa hibernate-envers


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-06-21
    • 2017-06-14
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 2012-07-05
    • 2017-08-01
    • 1970-01-01
    相关资源
    最近更新 更多