1

私はしばらくの間、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 プロパティである必要があります。

誰かが何が起こっているのか手がかりを持っているなら、私はとても感謝しています! ありがとうリチャード

4

2 に答える 2

2

この問題は、Hibernate Envers 4.x で発生しました。私たちにとっての解決策は、@AuditMappedByアノテーションを使用して Envers の注文列を識別することでした。ここの例に示すように、注文列の値を参照エンティティのフィールドにマップして、すべてを機能させる必要があります。

于 2015-07-23T15:39:27.563 に答える