【问题标题】:Overriding META-INF\services\org.hibernate.integrator.spi.Integrator覆盖 META-INF\services\org.hibernate.integrator.spi.Integrator
【发布时间】:2017-11-09 15:39:07
【问题描述】:

我正在使用休眠环境(4.3.5 版本)。使用条件审计 (15.8. hibernate envers doc) 我继承了 EnversIntegrator 创建了我自己的 customerEnversIntegrator。为了使 envers 使用这个,我在 META-INF\services\org.hibernate.integrator.spi.Integrator 中添加了 customerEnversIntegrator 路径。效果很好!当我将其保留为默认值,但将应用程序 META-INF\services\org.hibernate.integrator.spi.Integrator 更改为指向 customerEnversIntegrator 未完全使用时。所以它实际上没有用但我不希望这个声明处于 jar 级别。我需要从应用程序中覆盖它。因为作为一个项目 - 我无法控制 jar,它可以被更新等等。

任何想法如何在不更改 Jar 中的任何内容的情况下覆盖此文件?

【问题讨论】:

  • 我用一个侵入性较小的选项更新了我的答案,该选项应该允许您将 Integrator 放在应用程序代码中,而不必更改 hibernate-envers 库中的任何内容。
  • 我已经添加了 hibernate.listeners.envers.autoRegister=false 但问题是一样的。
  • “未完全使用”是什么意思?听起来Integrator 被解雇了,所以您的实现可能不正确?

标签: java hibernate hibernate-envers


【解决方案1】:

不幸的是,Envers 条件审计设置具有侵入性,这正是 Envers 6 想要采用侵入性较小的不同方法的原因。

您可以做的是通过指定 Hibernate 配置属性来关闭标准 Envers Integrator 实现,这将导致 envers 的标准集成器无法启动并且不注册标准事件侦听器等。

hibernate.listeners.envers.autoRegister=false

然后您注册您自己的自定义Integrator,它模仿标准实现,但由于明显的原因不检查上述配置属性的存在,并且注册您的自定义侦听器而不是标准侦听器。

这应该避免必须手动更改 hibernate-envers 工件或进行任何构建时库操作。

我很可能会在将来删除此配置选项,因为带注释的条件审计方法将成为这里的首选,并且避免不得不强迫想要这样做的用户复制内部代码才能使用此类功能。

【讨论】:

  • 我现在如何创建自定义历史记录。
  • 这是从 Envers 角度有条件地控制审计历史的唯一方法。另一种方法是在应用层、数据库触发器上执行此操作,或者使用 Hibernate 侦听器编写自己的实体状态比较机制。
  • 我使用了 hibernate.listeners.envers.autoRegister=false ,但我的自定义事件侦听器没有被触发。我认为需要更改 hibernate-envers 工件来触发我自己的集成器。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多