我在休眠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
,但我无法通过代码访问(或我不知道如何)。参见图片示例。
所以我的问题是:1-如何获得REVINFO
值?2-我真的必须使用entityManager,还是可以使用其他方法来实现它?
编辑2:如果我错了,请纠正我,但是forRevisionsOfEntityWithChanges是否可以像惰性初始化一样工作?我的意思是,如果我尝试接收例如modifiedBy
字段,则实际上得到了我的数据。调试器日志让我感到困惑。
对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可能使用代理,并且重要的是要了解,在这种情况下,您在调试器中获得的视觉表示可能准确无误,这取决于对象的内部状态是否由调试器窗口初始化。