如何在Hibernate环境中查询RevisionEntity

fcg9iug3  于 2023-10-23  发布在  其他
关注(0)|答案(3)|浏览(105)

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

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

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

这返回了一个List在对象数组中,第一个元素是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;
}

}

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

cwdobuhd

cwdobuhd1#

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

qnyhuwrf

qnyhuwrf2#

您想查询修订实体本身,还是检索包括修订实体在内的已审核对象?
如果你想查询修订实体本身,它是一个完全普通的实体。只需要像查询所有其他实体一样查询它--不是通过AuditQuery,而是使用EntityManagerSession
如果要检索包含修订实体的已审核对象,则上述内容是正确的,前提是存在对象更改所在的修订的修订数据。您是否在数据库中看到与返回的修订相对应的数据?

1u4esq0p

1u4esq0p3#

我知道这是一个老帖子,但我认为我有同样的问题,我的解释在某种程度上与上面的@Gregory解释相似。
在调试模式下,我能够在IntelliJ的调试窗口中看到我的@RevisionEntity注解实体的字段的null,位于对象的第一层。这是因为这个对象实际上是一个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

所以我可以像其他常规实体一样获取它们,并且它们不是null:

revisionEntity.getTimestamp()

相关问题