【发布时间】:2012-12-06 20:34:09
【问题描述】:
一段时间以来,我一直非常愉快地使用 Hibernate Envers 3.6。 但是,我遇到了有序列表的问题,这似乎会导致 Envers 失败。
我们有一个类 A 和一个 B 列表,在 例如,在 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 属性。
如果有人知道发生了什么,我将不胜感激! 谢谢 理查德
【问题讨论】:
-
只是添加,用@OrderBy 注释代替,Envers 初始化B 集合OK 没有错误
-
Envers 中有一个带有 (at)OrderColumn 的测试(请参阅下面的链接)。虽然它使用(at)ManyToMany。有没有机会使用最新的 Hibernate 进行测试? (4.1)github.com/hibernate/hibernate-orm/blob/master/hibernate-envers/…github.com/hibernate/hibernate-orm/blob/master/hibernate-envers/…
标签: hibernate lazy-loading hibernate-envers