如何在hibernate envers中查询RevisionEntity

问题描述 投票:0回答:3

我试图用 Envers 创建的修订记录其他用户数据。我能够使用 RevisionEntity 和 RevisionListener 来做到这一点,但我无法检索记录的数据。 我尝试了以下代码

    AuditQuery auditQuery = AuditReaderFactory
            .get(factory.getCurrentSession()).createQuery()
            .forRevisionsOfEntity(Currency.class, false, false)
            .add(AuditEntity.id().eq("ENV_US"));

    List<Object[]> l = auditQuery.getResultList();

这返回了一个列表 对象数组中第一个元素是 Revision,第二个元素是 RevisionEntity,第三个元素是 RevisionType,但 RevisionEntity 对象中的值都是 null。

这是 RevisionEntity 的 pojo

@Entity
@Table(name = "REVINFO")
@RevisionEntity(RevListener.class)
public class ExampleRevEntity {
@Id
@GeneratedValue
@RevisionNumber
@Column(name = "REV")
private int rev;

@RevisionTimestamp
@Column(name = "REVTSTMP")
private long revtstmp;

@Column(name = "USERID")
private String userId;

public String getUserId() {
    return userId;
}

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

}

如果我做错了什么,请告诉我。

java spring hibernate hibernate-envers
3个回答
1
投票

您可能需要实际使用该对象。 Hibernate/Envers 将返回一个延迟初始化的对象,调试器可能无法看到这些值。一旦您在代码中调用 getter,就应该填充正确的值。


0
投票

您想要查询修订实体本身,还是检索包括修订实体在内的审核对象?

如果你想查询修订实体本身,它是一个完全正常的实体。只需像所有其他实体一样查询它 - 不是通过

AuditQuery
,而是使用
EntityManager
Session

如果要检索包括修订实体的审核对象,则上述内容是正确的,前提是存在对象更改的修订版本的修订数据。您在数据库中看到与返回的修订版本相对应的数据吗?


0
投票

我知道这是一篇旧帖子,但我认为我遇到了同样的问题,并且我的解释在某种程度上与上面的@Gregory 解释类似。

在调试模式下,我能够在对象第一级下的 IntelliJ 调试窗口中看到 @RevisionEntity 注释实体的字段为空。这是因为该对象实际上是一个 Hibernate 代理,并且“真实”值(非空值)在该代理对象内部更深一层。

在 IntelliJ 中“评估表达式”以检查对象的内容后,返回了正确的值:

MyCustomRevisionEntity revisionEntity = (MyCustomRevisionnEntity) ((Object[]) AuditReaderFactory
                .get(entityManager)
                .createQuery()
                .forRevisionsOfEntity(Foo.class, false, false)
                .add(AuditEntity.id().eq(1L))
                .getResultList()
                .get(3))
                [1];

MyCustomRevisionEntity
对象内,我的值位于
target
字段中:

((ByteBuddyInterceptor)this.$$_hibernate_interceptor).target

所以我能够像任何其他常规实体一样获取它们,并且它们不为空:

revisionEntity.getTimestamp()
© www.soinside.com 2019 - 2024. All rights reserved.