[英]Hibernate Envers - select “all” changes for entity ID
我对 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");
}
}
我如何 select 每次更改实体 ID 及其“REVINFO”object?
我有这样的事情:
List resultList = AuditReaderFactory.get(entityManager)
.createQuery()
.forRevisionsOfEntityWithChanges(ClientType.class, true)
.add(AuditEntity.id().eq(entityId))
.getResultList();
它几乎工作得很好。 我收到了每一个“变化”,但REVINFO
看起来很奇怪。 所有字段都是 null - 还有 1 个 object $$_hibernate_interceptor
实际上包含“信息”,但我无法通过代码访问它(或者我不知道如何)。 请参见图片中的示例。
所以我的问题是: 1 - 我怎样才能获得REVINFO
值? 2 - 我真的必须使用 entityManager,还是可以用不同的方法来实现?
编辑 2:如果我错了,请纠正我,但 forRevisionsOfEntityWithChanges 是否可以作为延迟初始化? 我的意思是,如果我尝试接收例如modifiedBy
字段,我实际上会得到我的数据。 调试器日志让我感到困惑。
对forRevisionsOfEntityWithChanges
的调用返回一个 object 数组,其中包含:
如何获得 REVINFO 值? 2 - 我真的必须使用 entityManager,还是可以用不同的方法来实现?
因此,在您的代码中,要获取修订信息属性,您将执行以下操作。 请注意,在此代码中,修订信息 object 的类型将取决于您的配置,或者您是否在部署中使用自定义修订信息实体 class。 只要确保将其转换为正确的类型即可。
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 可能使用代理,重要的是要理解在这种情况下,您在调试器中获得的视觉表示可能准确也可能不准确,具体取决于对象的内部 state 是否由调试器 Z044B8C742702FBF2 初始化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.