#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
noryourEntityClassId
, у меня есть толькоrevisionId
. И ИМО этого должно быть достаточно для envers, чтобы получить общий объект объекта аудита.2. Обновлено со ссылкой на API, который принимает только тип класса объекта ревизии и номер редакции, как вы указали.