繁体   English   中英

Hibernate Envers - select 实体 ID 的“全部”更改

[英]Hibernate Envers - select “all” changes for entity ID

我对 Hibernate Envers 有疑问。 我有这样的课程:

@Entity
@Table(name = "REVINFO")
@RevisionEntity(MyRevisionEntityListener.class)
public class RevEntity {
    @Id
    @RevisionNumber
    @Column(name = "REV", nullable = false, updatable = false)
    private Integer id;

    @RevisionTimestamp
    @Column(name = "REVTSTMP", nullable = false, updatable = false)
    private Date timestamp;

    @Column(name = "MODIFIED_BY", length = 100)
    private String modifiedBy;

    @Column(name = "COMMENT", length = 100)
    private String comment;
public class MyRevisionEntityListener implements RevisionListener {
    @Override
    public void newRevision(Object revisionEntity) {
        RevEntity a = (RevEntity) revisionEntity;
        a.setComment("Some value");
    }
}

我如何 select 每次更改实体 ID 及其“REVINFO”object?

我有这样的事情:

   List resultList = AuditReaderFactory.get(entityManager)
                .createQuery()
                .forRevisionsOfEntityWithChanges(ClientType.class, true)
                .add(AuditEntity.id().eq(entityId))
                .getResultList();

它几乎工作得很好。 我收到了每一个“变化”,但REVINFO看起来很奇怪。 所有字段都是 null - 还有 1 个 object $$_hibernate_interceptor实际上包含“信息”,但我无法通过代码访问它(或者我不知道如何)。 请参见图片中的示例。 在此处输入图像描述

所以我的问题是: 1 - 我怎样才能获得REVINFO值? 2 - 我真的必须使用 entityManager,还是可以用不同的方法来实现?

编辑 2:如果我错了,请纠正我,但 forRevisionsOfEntityWithChanges 是否可以作为延迟初始化? 我的意思是,如果我尝试接收例如modifiedBy字段,我实际上会得到我的数据。 调试器日志让我感到困惑。

forRevisionsOfEntityWithChanges的调用返回一个 object 数组,其中包含:

  • 实体实例
  • 修订实体
  • 修订类型
  • 已更改的属性名称。

如何获得 REVINFO 值? 2 - 我真的必须使用 entityManager,还是可以用不同的方法来实现?

因此,在您的代码中,要获取修订信息属性,您将执行以下操作。 请注意,在此代码中,修订信息 object 的类型将取决于您的配置,或者您是否在部署中使用自定义修订信息实体 class。 只要确保将其转换为正确的类型即可。

for (Object entry : resultList) {
  final Object[] row = (Object[]) entry;
  final TheRevisionEntityClassType revisionInfo = row[1];
  // now you can get the revision entity attributes from revisionInfo using getters
}

如果我错了,请纠正我,但是 forRevisionsOfEntityWithChanges 是否可以作为延迟初始化? 我的意思是,如果我尝试接收例如 modifiedBy 字段,我实际上会得到我的数据。 调试器日志让我感到困惑。

根据查询,是的 Hibernate 可能使用代理,重要的是要理解在这种情况下,您在调试器中获得的视觉表示可能准确也可能不准确,具体取决于对象的内部 state 是否由调试器 Z044B8C742702FBF2 初始化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM