有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么Hibernate Envers会忽略我的自定义修订实体?

我正在使用JPA2.1(由Hibernate4.2.11支持)和Spring4.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注释被忽略了。 有什么想法吗


共 (3) 个答案

  1. # 1 楼答案

    我终于找到了问题所在。我的猜测是对的,hibernate忽略了我的Envers类,因为EntityManagerFactory配置中有一个参数:

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

    我们需要告诉hibernate检查我们的。“基本包”。 愚蠢的问题容易解决

  2. # 2 楼答案

    对于任何与SpringBoot合作的人,你可以改变这一点

    @EntityScan(basePackages = {"yourpackage.entities","yourpackage.envers.entity"})
    
  3. # 3 楼答案

    即使在完成上述步骤后,我还是遇到了问题。我将AuditedRevisionEntity添加到persistance中。xml文件来解决这个问题

    我们的。基本包。其他包裹。AuditedRevisionEntity