休眠Envers-为实体ID选择“所有”更改

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

我在休眠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,但我无法通过代码访问(或我不知道如何)。参见图片示例。enter image description here

所以我的问题是:1-如何获得REVINFO值?2-我真的必须使用entityManager,还是可以使用其他方法来实现它?

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

java hibernate hibernate-envers
1个回答
0
投票

forRevisionsOfEntityWithChanges的调用返回包含以下内容的对象数组:

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

我如何获取REVINFO值? 2-我真的必须使用entityManager,还是可以使用其他方法来实现它?

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

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是否可以作为惰性初始化?我的意思是,如果我尝试接收例如ModifyBy字段,我实际上会得到我的数据。调试器日志让我感到困惑。

取决于查询,是的,Hibernate可能使用代理,并且重要的是要了解,在这种情况下,您在调试器中获得的视觉表示可能准确无误,这取决于对象的内部状态是否由调试器窗口初始化。

© www.soinside.com 2019 - 2024. All rights reserved.