3

制御したい要素のリストを公開するビジネスオブジェクトがあります。

そのために、要素が追加/削除されるたびに通知されるリスナーを使用して、カスタムリスト実装( CustomList)を作成しました。

public class MyClass {
    private List<ItemClass> list;

    public MyClass() {
        this.list = new CustomList<ItemClass>();
    }

    public List<ItemClass> getList() {...}
    public setList(List<ItemClass>) {...}
}

問題は、このオブジェクトを永続化する場合、Hibernateがセッターを使用して独自のList実装でリストを設定するため、CostumListの優れた動作が短絡することです。

私はこのようにセッターでカンニングを試みました:

public setList(List<ItemClass> newList) {
    this.list.clean():
    this.list.addAll(newList);
}

ただし、これも機能しません 。Hibernateは最初にセッターを呼び出し、次にいくつかの要素を独自のリストに追加します。したがって、私は私の側に空のリストになってしまいます。

カスタムリストの実装を使用するように休止状態に要求する方法はありますか?または、コンテンツを読み込んだ後に入力しますか?

よろしくお願いします。

4

1 に答える 1

2

私の最初の考えは、次のようなことをすることでした。

いつでもセッターを使用してリストの実装を変更できます(これまでと同様)。例えば:

public setList(List<ItemClass> newList) {
    // Sets the list as a custom list.
    list = new CustomList<>(newList);
}

ただし、これを機能させるには、 CustomListの実装をデコレータとして機能するように変更する必要があります。 これにより、ラップされたリストの種類に関係なく機能します。

@millimooseが気付いたように、それでも問題は解決しません。

実用的な解決策は、Hibernate(またはJPA)ライフサイクルアノテーション(@ PostPersist、@ PostUpdate、@ PostLoad ...など)を使用して見つけることができます。したがって、そのcustomList.addAll()ソリューションを使用できます(エンティティが更新、永続化、またはロードされた後)。

于 2012-12-09T17:43:43.343 に答える