【问题标题】:How to catch errors in Envers?如何捕捉 Envers 中的错误?
【发布时间】:2020-03-18 21:04:18
【问题描述】:

我已将表的自动更新设置为无

spring.jpa.properties.hibernate.hbm2ddl.auto=none

这样,当我运行 Envers 时,我将不得不自己创建审计表。但是,当我使用 @Audited 注释设置要审计的实体并且我没有为该实体创建审计表时,我遇到了错误,因为 Envers 然后尝试填充不存在的审计表。此错误至关重要,因为它会因审计中断而中断更新/插入/删除实体的过程。

有什么方法可以对 Envers 进行某种 try/catch,这样如果出现这种错误,它就不会破坏主进程?

附言

我还使用测试数据库自动创建审计表,但它在设定的时间或调用时运行。如果我忘记调用脚本或表的测试数据库更新失败,我仍然希望通过某种方式检查错误并绕过审计。

【问题讨论】:

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


    【解决方案1】:

    此错误至关重要,因为它会因审计中断而中断更新/插入/删除实体的过程。

    这就是重点。

    当您定义与@Audited 映射的实体时,您已指定要跟踪对该实体的更改,因此如果由于缺少表或列而无法跟踪此类更改,则事务将回滚以保持两者之间的一致性状态审计表和主实体表。

    在 Hibernate 6 中,我们实际上正在考虑引入分类 HBM2DDL 控件,您可以在其中为主要实体表设置 none 并为 Envers 使用 update,这完全避免了您面临的这个问题,因为Envers 背后的要点是隐藏主表。

    现在您可以简单地将 hbm2ddl.auto 配置属性设置为 validate 以至少在您的进程早期而不是在运行时报告问题(如果缺少表)。

    【讨论】:

    • 感谢您的回复。 Envers 的单独 HBM2DDL 控件肯定会解决我的问题。无论如何,我是否可以进入 Envers 源代码并修改任何内容以在插入之前检查审计表是否存在?如果没有,那么继续而不是抛出错误。在将@Audited 注释添加到实体后,我希望我的审计实现是免提的。
    • 一切皆有可能,问题是它是否实用。检查每个实体插入/更新/删除事件的表是否存在将大大提高性能,因此我建议不要这样做。否则,您需要扩展所有 Envers 事件侦听器并添加此类逻辑或尝试在引导期间作为集成器缓存有关此的信息,然后在每个事务期间检查此共享状态。但同样,我强烈建议不要这样做。
    • 我明白了。我将不得不考虑更多,但感谢您的洞察力。希望 Hibernate 6 有这个补丁 :)。
    猜你喜欢
    • 1970-01-01
    • 2010-12-06
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 2019-12-18
    • 2010-12-05
    • 2017-09-22
    相关资源
    最近更新 更多