Hibernate Envers — пользовательский идентификатор ревизии — как получить запись

#hibernate-envers

#спящий режим-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, например, username. Как я могу это сделать? Есть ли какой-либо поддерживаемый API для его получения?

Ответ №1:

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

 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 здесь

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

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

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

Комментарии:

1. Я предполагаю, что YourEntityClass.class вы не имеете в виду AuditEntity.class , верно? У меня нет YourEntityClass.class nor yourEntityClassId , у меня есть только revisionId . И ИМО этого должно быть достаточно для envers, чтобы получить общий объект объекта аудита.

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