私はしばらくの間、Hibernate Envers 3.6 を非常に快適に使用してきました。ただし、Envers が失敗する原因と思われる順序付きリストの問題に遭遇しました。
B のリストを持つクラス A があり、たとえばクラス A で 1 対多にマッピングされます。
@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
}
最近では、DB 内のリストの一貫した順序を確保するために、getB() メソッドに「orderColumn」アノテーションを追加する必要がありました。
例えば、
@OneToMany(mappedBy = "A", cascade = CascadeType.ALL, orphanRemoval = true)
@OrderColumn(name="columnIndex")
public List<B> getB() {
return this.B;
}
これにより、Envers でのコレクションの初期化が完全に中断され、null ポインター例外で失敗します。
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 プロパティである必要があります。
誰かが何が起こっているのか手がかりを持っているなら、私はとても感謝しています! ありがとうリチャード