Warum ignoriert Hibernate Envers meine benutzerdefinierte RevisionEntity?

Ich entwickle eine Anwendung mit JPA 2.1 (unterstützt von Hibernate 4.2.11) mit Spring 4.0.2. Wir verwenden Envers zur Prüfung von Änderungen in Projektentitäten. Das funktioniert gut. Das Problem tritt auf, wenn wir versuchen, benutzerdefinierte Revision Entity zu verwenden, wie in der Dokumentation von Envers angegeben:http://docs.jboss.org/hibernate/core/4.1/devguide/en-US/html/ch15.html#envers-revisionlog

Wir haben eine benutzerdefinierte Klasse und einen benutzerdefinierten Listener erstellt, wie in der Dokumentation gezeigt, aber es scheint, dass sie von Hibernate vollständig ignoriert werden. Die benutzerdefinierten Klassen:

@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);
  }

}

Es ist so, als würde der Ruhezustand diese Klassen nicht berücksichtigen, da dies ausreichen sollte, um die Annotation zu verwenden: @RevisionEntity (AuditingRevisionListener.class). Die anderen mit Anmerkungen versehenen Entitäten sind gut bekannt, dies wird jedoch einfach ignoriert. Wir haben in unserer Spring-Konfiguration (wir verwenden nicht persistence.xml) die Basispakete, die beim Laden des Spring-Kontexts gescannt werden sollen:

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

Ist das genug?

Wir haben auch einen anderen Ansatz ausprobiert. So legen Sie den Revisionslistener mit dieser Eigenschaft in der EntityManagerFactory-Konfiguration manuell fest

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

In der ersten Zeile der newRevision-Methode wird jedoch eine classcastexception angezeigt, da der Parameter revisionEntity nicht der Klasse AuditedRevisionEntity entspricht. Wieder ist wie die Klasse AuditedRevisionEntity nicht geladen.

Ich nehme an, es ist eine einfache Frage, aber ich kann nicht erraten, warum die @ TelevisionEntity-Annotation ignoriert wird. Irgendeine Idee?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage