2016-10-19 6 views
0

я написал свой собственный класс RevisionEntity для хранения дополнительных данных (например, имя пользователя), как показано ниже:Hibernate Envers - заказ RevisionEntity - как получить запись

@Entity 
@RevisionEntity(AuditListener.class) 
@Table(name = "REVINFO", schema = "history") 
@AttributeOverrides({ 
     @AttributeOverride(name = "timestamp", column = @Column(name = "REVTSTMP")), 
     @AttributeOverride(name = "id", column = @Column(name = "REV")) }) 
public class AuditEntity extends DefaultRevisionEntity { 

    private static final long serialVersionUID = -6578236495291540666L; 

    @Column(name = "USER_ID", nullable = false) 
    private Long userId; 

    @Column(name = "USER_NAME") 
    private String username; 

    public Long getUserId() { 
     return userId; 
    } 

    public void setUserId(Long userId) { 
     this.userId = userId; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 
} 

Я могу видеть, что все строки в базе данных, правильно хранится, таблица REVINFO содержит также имя пользователя.

Я хотел бы запросить базу данных, чтобы получить подробную информацию из моего пользовательского RevisionEntity, например, имя пользователя. Как я могу это сделать? Есть ли поддерживаемый API для его получения?

ответ

2

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

final AuditReader auditReader = AuditReaderFactory.get(session); 
List<?> results = auditReader.createQuery() 
    .forRevisionsOfEntity(YourEntityClass.class, false, false) 
    .add(AuditEntity.id().eq(yourEntityClassId)) 
    .getResultList(); 

Возвращаемые результаты будут содержать массив объектов , например Object[] где results[1] будет содержать экземпляр объекта ревизии, который содержит соответствующую информацию, которую вы хотите.

Для получения более подробной информации, вы можете увидеть в документации Java комментарии here

Если у вас есть только номер версии, вы можете получить доступ только к экземпляру сущности ревизии непосредственно:

// I use YourAuditEntity here because AuditEntity is actually an Envers class 
YourAuditEntity auditEntity = auditReader 
    .findRevision(YourAuditEntity.class, revisionId); 

Для получения более подробной информации о интерфейс AuditReader, вы можете увидеть java-документацию here

+0

Я полагаю, что с помощью 'YourEntityClass.class' вы не имеете в виду' AuditEntity.class', правильно? У меня нет 'YourEntityClass.class' или' yourEntityClassId', у меня есть 'versionId'. И IMO должно быть достаточно, чтобы пользователи могли получить общий объект аудита. – bontade

+1

Обновлен со ссылкой на API, который, как вы указали, принимает только тип класса объекта ревизии и номер версии. – Naros

+0

Большое спасибо! Оно работает – bontade