我正在使用 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-revision 日志 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 注释被忽略。
任何想法?