一段时间以来,我一直非常愉快地使用 Hibernate Envers 3.6。但是,我遇到了有序列表的问题,这似乎导致 Envers 失败。
我们有一个带有 B 列表的 A 类,例如在 A 类中一对多映射
@OneToMany(mappedBy = "A", cascade = CascadeType.ALL, orphanRemoval = true)
public List<B> getB() {
return this.B;
}
当我检索修订时,我加载适当的 A 实例,然后显式初始化 B 的集合:例如,
for (B b: rvision.getB()){
b.getClass();// init fields
}
最近虽然我们需要在 getB() 方法上添加一个“orderColumn”注释,以确保数据库中列表的顺序一致。
例如,
@OneToMany(mappedBy = "A", cascade = CascadeType.ALL, orphanRemoval = true)
@OrderColumn(name="columnIndex")
public List<B> getB() {
return this.B;
}
这完全破坏了 Envers 中的集合初始化,失败并出现空指针异常:
java.lang.NullPointerException
at org.hibernate.envers.entities.mapper.relation.lazy.initializor.ListCollectionInitializor.addToCollection(ListCollectionInitializor.java:81)
at org.hibernate.envers.entities.mapper.relation.lazy.initializor.ListCollectionInitializor.addToCollection(ListCollectionInitializor.java:39)
at org.hibernate.envers.entities.mapper.relation.lazy.initializor.AbstractCollectionInitializor.initialize(AbstractCollectionInitializor.java:67)
at org.hibernate.envers.entities.mapper.relation.lazy.proxy.CollectionProxy.checkInit(CollectionProxy.java:50)
at org.hibernate.envers.entities.mapper.relation.lazy.proxy.CollectionProxy.size(CollectionProxy.java:55)
etc....
我们已将其隔离为单元测试;切换 OrderColumn 注释足以导致此问题。OrderColumn 与常规 Hibernate 一起工作正常。
问题似乎源于 org.hibernate.envers.entities.mapper.relation.component.MiddleSimpleComponentMapper 的第 47 行:
return ((Map<String, Object>) data.get(verEntCfg.getOriginalIdPropName())).get(propertyName);
基本上,它正在寻找的“propertyName”被称为“mapKey”,并且查找在不应该时返回 null。这不是我的对象的属性,所以它必须是一些内部 Envers 属性。
如果有人知道发生了什么,我将不胜感激!谢谢理查德