1

一段时间以来,我一直非常愉快地使用 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 属性。

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

4

2 回答 2

2

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

于 2015-07-23T15:39:27.563 回答
1

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

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

于 2014-03-06T17:58:35.963 回答