2014-05-29 4 views
3

Я разрабатываю приложение, использующее JPA 2.1 (поддерживается спящим 4.2.11) с пружиной 4.0.2. Мы используем Envers для проверки изменений в объектах проекта. Это прекрасно работает. Проблема возникает, когда мы пытаемся использовать пользовательские Revision Entity в Envers документации говорит: http://docs.jboss.org/hibernate/core/4.1/devguide/en-US/html/ch15.html#envers-revisionlogПочему Hibernate Envers игнорирует мой пользовательский RevisionEntity?

Мы сделали специальный класс и пользовательский слушателю, как указал в документации, но это, кажется, что они полностью игнорируют 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); 
    } 

} 

Это как спящий режим не принимая во внимание эти классы, потому что она должна быть достаточно том, чтобы он работал, чтобы использовать аннотацию: @RevisionEntity (AuditingRevisionListener.class). Другие аннотированные объекты хорошо известны, но это просто игнорируется. Мы имеем в нашей весенней конфигурации (мы не используют persistence.xml) базовые пакеты, которые будут проверяться при загрузке контекста пружины:

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

Достаточно ли этого?

Мы также попробовали еще один подход. Для того, чтобы установить вручную ревизии слушателя с этим свойством в EntityManagerFactory конфигурации

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

Но мы получаем ClassCastException в первой строке методы newRevision, поскольку revisionEntity параметра не класс AuditedRevisionEntity. Опять же, как класс AuditedRevisionEntity не загружен.

Я полагаю, что это простой вопрос, но я не могу угадать, почему аннотация @RevisionEntity игнорируется. Любая идея?

ответ

5

Наконец-то я получил, где проблема была. Мои подозреваемые были правы, спящий режим игнорировал мои Envers классы из-за этого парам в EntityManagerFactory конфигурации:

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

Мы должны сказать спящий режим, чтобы проверить «our.basepackage». Глупое решение проблемы.

+0

Можете ли вы поделиться, где ты сказал зимуют, чтобы проверить «your.base.package», у меня такая же проблема. Спасибо – OJVM

+0

После отладки envers я обнаружил, что таблица «revinfo» не работает, потому что в моей сущности я не добавлял аннотацию @Table, поэтому имя таблицы ревизий было таким же, как мое имя сущности. после добавления @Table (name = 'REVINFO') все начало работать нормально. – OJVM

-1

У меня проблемы даже после вышеуказанных шагов. Я добавил файл AuditedRevisionEntity в файл persistance.xml, чтобы решить проблему.

our.basepackage.otherpackage.AuditedRevisionEntity

Смежные вопросы