hibernate envers和有序列表

时间:2012-12-19 13:16:45

标签: hibernate lazy-loading hibernate-envers

我一直很乐意使用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属性。

如果有人知道发生了什么,我将非常感激! 谢谢  理查德

2 个答案:

答案 0 :(得分:1)

几周前我遇到了同样的问题。

我刚刚添加了Envers正在寻找的@MapKey注释,到目前为止我还没有看到任何进一步的问题。

答案 1 :(得分:1)

我们遇到了Hibernate Envers 4.x的这个问题。我们的解决方案是使用@AuditMappedBy注释来标识Envers的订单列。如示例here所示,有必要将订单列值映射到引用实体的字段中,以使其全部工作。