Hibernate Envers - 如何将自定义 RevisionEntity 列映射到审核查询

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

我已将解决方案中的审核支持和修订分开。它工作正常,但我不知道如何创建一个查询来获取审计数据从查询结果中的

REVINFO
映射到
MyEntity
的所有修订。就像在
MYENTITY_AUD
上加入
REVINFO
REV
来表示 LastModified 列一样。对于创建的列,情况更加复杂,因为它可能需要带有
REVTYPE = 0
的子查询。

private List<MyEntity> allRevisions() {
  AuditReaderFactory.get(entityManager).createQuery()
    .forRevisionsOfEntity(MyEntity.class, true, true)        
    .addOrder(AuditEntity.revisionNumber().asc())
    .getResultList();
}

我的桌子看起来像这样:

MYENTITY table
+---------------------------------------------------------------------------+
| ID | MYDATA | CREATEDBY | CREATEDDATE | LASTMODIFIEDBY | LASTMODIFIEDDATE |
+---------------------------------------------------------------------------+

MYENTITY_AUD table
+-----------------------------+
| ID | REV | REVTYPE | MYDATA |
+-----------------------------+

REVINFO table
+-----------------------------+
| REV | REVTSTMP | MODIFIEDBY |
+-----------------------------+

代码示例:

@Audited
@Entity
public class MyEntity {
    
    private String myData;

    @CreatedBy
    @NotAudited
    private String createBy;

    @CreateDate
    @NotAudited
    private LocalDateTime createdDate;

    @LastModifiedBy
    @NotAudited
    private String lastModifiedBy;

    @LastModifiedDate
    @NotAudited
    private LocalDateTime lastModifiedDate;
}

@Entity
@Table(name = "REVINFO")
@RevisionEntity(MyRevisionListener.class)
public class MyRevisionEntity implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @RevisionNumber
    @Column(name = "REV")
    private int id;

    @RevisionTimestamp
    @Column(name = "REVTSTMP")
    private long timestamp;

    @Column(name = "MODIFIED_BY")
    private String modifiedBy;
    ...
}
public class MyRevisionListener implements RevisionListener {

    @Override
    public void newRevision(Object revisionEntity) {
        MyRevisionEntity revision = (MyRevisionEntity) revisionEntity;
        revision.setModifiedBy(MyContext.getUserName())
    }
}

谢谢。

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

我不确定我是否正确理解你的问题,因为你似乎已经拥有了你需要的一切。

根据您的

MyRevisionEntity
MyRevisionListener
实现,Envers 使用您的
MyRevisionEntity
作为修订版本。

如果您想在

allRevisions
方法中获取修订信息,只需将提供给
boolean
方法的第一个
forRevisionsOfEntity
设置为
false
即可。然后,查询返回一个
List<Object[]>
,其中包含
MyEntity
MyRevisionEntity

private List<Object[]> allRevisions() {
  AuditReaderFactory.get(entityManager).createQuery()
    .forRevisionsOfEntity(MyEntity.class, false, true)        
    .addOrder(AuditEntity.revisionNumber().asc())
    .getResultList();
}
© www.soinside.com 2019 - 2024. All rights reserved.