Spring 启动和休眠环境:手动更新 AUD-Table
Spring Boot and Hibernate Envers: Manually updating AUD-Table
我想手动更新 AUD-table 的记录,这些记录由 Hibernate Envers 在同一事务中生成和填充。
可悲的是,我没有发现我可以收听的 JPA 或 Envers 事件,我在 JPA 事务提交之前是正确的,但 AUD-tables 已经填充。
你知道我该怎么做吗?
我正在使用 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 版本 5.4.0 起,此问题已得到修复。现在 AuditStrategies 更加灵活和模块化。
我想手动更新 AUD-table 的记录,这些记录由 Hibernate Envers 在同一事务中生成和填充。 可悲的是,我没有发现我可以收听的 JPA 或 Envers 事件,我在 JPA 事务提交之前是正确的,但 AUD-tables 已经填充。
你知道我该怎么做吗?
我正在使用 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
中注册您的自定义 AuditStrategyspring.jpa.properties.org.hibernate.envers.audit_strategy=com.example.CustomAuditStrategy
自 Hibernate 版本 5.4.0 起,此问题已得到修复。现在 AuditStrategies 更加灵活和模块化。