我已将解决方案中的审核支持和修订分开。它工作正常,但我不知道如何创建一个查询来获取审计数据从查询结果中的
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())
}
}
谢谢。
我不确定我是否正确理解你的问题,因为你似乎已经拥有了你需要的一切。
根据您的
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();
}