【问题标题】:Why Hibernate Envers is ignoring my custom RevisionEntity?为什么 Hibernate Envers 忽略了我的自定义 RevisionEntity?
【发布时间】:2018-07-24 20:49:08
【问题描述】:

我正在开发一个使用 JPA 2.1(由 hibernate 4.2.11 支持)和 spring 4.0.2 的应用程序。我们使用 Envers 来审计项目实体的变化。那工作正常。 当我们尝试使用自定义修订实体时,问题就出现了,正如 Envers 文档所说:http://docs.jboss.org/hibernate/core/4.1/devguide/en-US/html/ch15.html#envers-revisionlog

我们已经制作了文档中指出的自定义类和自定义侦听器,但 Hibernate 似乎完全忽略了它们。自定义类:

@Entity
@RevisionEntity(AuditingRevisionListener.class)
public class AuditedRevisionEntity extends DefaultRevisionEntity {
  private String username;

  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }    
}


public class AuditingRevisionListener implements RevisionListener {
  private static Log log = LogFactory.getLog(AuditingRevisionListener.class.getName());

  @Override
  public void newRevision(Object revisionEntity) {
    AuditedRevisionEntity revEntity = (AuditedRevisionEntity) revisionEntity;
    String userName = SecurityContextHolder.getContext().getAuthentication().getName();
    revEntity.setUsername(userName);
  }

}

这就像hibernate没有考虑到这些类,因为它应该足以让它使用注释:@RevisionEntity(AuditingRevisionListener.class)。其他带注释的实体被很好地识别,但这只是被忽略了。我们在 spring 配置中(我们不使用 persistence.xml)加载 spring 上下文时要扫描的基本包:

  <context:component-scan base-package="our.basepackage" />

这就够了吗?

我们还尝试了另一种方法。在 EntityManagerFactory 配置中使用此属性手动设置修订监听器

    <prop key="org.hibernate.envers.revision_listener">our.basepackage.AuditingRevisionListener</prop>

但是我们在 newRevision 方法的第一行得到了一个 classcastexception,因为参数 revisionEntity 不是类 AuditedRevisionEntity。再次就像类 AuditedRevisionEntity 没有加载一样。

我认为这是一个简单的问题,但我无法猜测为什么 @RevisionEntity 注释被忽略了。 任何想法?

【问题讨论】:

    标签: java spring jpa hibernate-envers


    【解决方案1】:

    我终于找到了问题所在。我的怀疑是对的,由于 EntityManagerFactory 配置中的这个参数,hibernate 忽略了我的 Envers 类:

    <property name="packagesToScan" value="our.basepackage.otherpackage" />
    

    我们需要告诉 hibernate 检查“our.basepackage”。 愚蠢的问题容易解决。

    【讨论】:

    • 你能分享你在哪里告诉休眠检查'your.base.package',我有同样的问题。谢谢
    • 调试envers后,我发现'revinfo'表不起作用,因为在我的实体中我没有添加@Table注释,所以修订表的名称与我的实体相同姓名。添加 @Table(name = 'REVINFO') 后一切正常。
    【解决方案2】:

    对于任何使用 SpringBoot 的人,您可以更改此设置

    @EntityScan(basePackages = {"yourpackage.entities","yourpackage.envers.entity"})
    

    【讨论】:

      【解决方案3】:

      即使经过上述步骤,我也遇到了问题。我已将 AuditedRevisionEntity 添加到persistance.xml 文件以解决问题。

      our.basepackage.otherpackage.AuditedRevisionEntity

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-30
        • 2020-11-09
        • 2015-04-16
        • 2018-02-22
        • 2021-02-17
        • 2018-08-18
        • 2013-09-30
        • 2016-06-20
        相关资源
        最近更新 更多