【问题标题】:Hibernate Envers - select "all" changes for entity IDHibernate Envers - 为实体 ID 选择“所有”更改
【发布时间】:2020-04-11 19:42:21
【问题描述】:

我对 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");
    }
}

如何选择实体 ID 及其“REVINFO”对象的每次更改?

我有这样的东西:

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

而且它几乎工作得很好。我收到了每一个“变化”,但REVINFO 看起来很奇怪。所有字段均为空 - 还有 1 个对象 $$_hibernate_interceptor 实际上包含“信息”,但我无法通过代码访问它(或者我不知道如何访问它)。请参见图片中的示例。

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

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

【问题讨论】:

    标签: java hibernate hibernate-envers


    【解决方案1】:

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

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

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

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

    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 可能会使用代理,重要的是要理解在这种情况下,您在调试器中获得的视觉表示可能准确也可能不准确,具体取决于对象的内部状态是否由调试器窗口初始化或不是。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-22
      • 2019-12-13
      • 2012-12-05
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多