java - Hibernate Envers - 选择 "all"更改实体 ID

标签 java hibernate hibernate-envers

我在使用 Hibernate Envers 时遇到问题。 我有这样的类(class):

@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 字段,我实际上会得到我的数据。调试器日志让我很困惑。

最佳答案

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

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

How can i get REVINFO values ? 2 - Do i realy have to use entityManager, or can it be achived with different approach ?

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

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
}

Correct me if i am wrong, but does forRevisionsOfEntityWithChanges works as Lazy Initialization? I mean, if i try to receive for example modifiedBy field i actually get my data. Debugger log make me confused.

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

关于java - Hibernate Envers - 选择 "all"更改实体 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61162714/

相关文章:

java - 在 portlet 和 *LocalServiceImpl 中使用公共(public)对象

java - Google Cloud Datastore - 不平等返回 "no matching index found"

java - 在 Java Web 应用程序中处理 UI 层有哪些常见方法?

java - Hibernate Envers - 请求更改对象列表

java - 数据未插入到 Spring-Hibernate-envers webapp 中的审计表中

java - 如何设置swing组件的大小

java - Hibernate 共享实体竞争条件

hibernate - native 查询 Jpa 存储库在没有列规范的情况下无法工作

hibernate - 在 Hibernate 中防止 SQL 注入(inject)

java - Hibernate Envers - 传递自定义字段