我一直很乐意使用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属性。
如果有人知道发生了什么,我将非常感激! 谢谢 理查德
答案 0 :(得分:1)
我刚刚添加了Envers正在寻找的@MapKey注释,到目前为止我还没有看到任何进一步的问题。
答案 1 :(得分:1)
我们遇到了Hibernate Envers 4.x的这个问题。我们的解决方案是使用@AuditMappedBy
注释来标识Envers的订单列。如示例here所示,有必要将订单列值映射到引用实体的字段中,以使其全部工作。