为什么Hibernate Envers忽略了我的自定义RevisionEntity?

我正在使用Spring 4.0.2开发一个使用JPA 2.1(由hibernate 4.2.11支持)的应用程序。 我们使用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 config中(我们不使用persistence.xml)在加载spring上下文时要扫描的基础包:

   

这够了吗?

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

  our.basepackage.AuditingRevisionListener 

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

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

最后我得到了问题所在。 我的嫌疑人是对的,由于EntityManagerFactory配置中的这个参数,hibernate忽略了我的Envers类:

  

我们需要告诉hibernate检查’our.basepackage’。 傻问题易解决。

对于任何使用SpringBoot的人来说,你可以改变它

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

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

our.basepackage.otherpackage.AuditedRevisionEntity