0

プログラムで一連のオブジェクトを作成し、それらすべてを永続化する必要があります。1:n1:1および関係がn:n同時に関係しています。

すべての関係は で定義されCascadeType.Allます。

すべてのオブジェクト インスタンスを作成してそれらの関係を設定すると、最初のpersist()操作だけが機能します。他のものは、切り離されたエンティティが持続するために渡されたというメッセージで失敗します。

例:

A a1 = new A();
A a2 = new A();
A a3 = new A();

CommonB = new B();
SpecialB = new B();

Set<B> set1 = new HashSet<B>();
set1.add(CommonB);
set1.add(SpecialB);

Set<B> set2 = new HashSet<B>();
set2.add(CommonB);

a1.setBs(set1);
a2.setBs(set2);
a3.setBs(set2);

今、私はデータサービスを使用してa1、a2、およびa3を永続化しています。(基本的には、entitymanager で persist() を呼び出すだけです)

CommonB最初の試みは両方ともうまく機能し、SpecialB一緒に永続化a1されます (関係も作成されます。ただし、永続化しようとするa2と、Hibernate は言いますorg.hibernate.PersistentObjectException: detached entity passed to persist: my.namespace.B

クラスは次のようになります。

class A(){
    @ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL })
    @JoinTable
    private Set<B> bs;

    //get set
}

class B(){
    @ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, mappedBy = "bs")
    private Set<A> as;
}

この例は簡略化されており、実際にはn:n5 つのエンティティ間に複数の関係があります。

- - アップデート

「Bs」セットにも「As」を追加するのを逃しました。

CommonB.setAs(/* a1, a2, a3 */);
SpecialB.setAs(/* a1 */);

したがって、完全なリレーションオブジェクト レベルで設定されていると言えます。Cascade.Allそれらのオブジェクトの 1 つを保存するたびに、特定のリレーション群内のすべてのオブジェクトを永続化することを実際に処理する必要はありませんか?

私が好きなようem.persist(a1)に与えた場合、通知を休止状態にすべきではありません:

  • a1 は CommonB と Special B に関連しています。
  • CommonB は a2 と a3 に関連しています。
  • だから私はa1、a2、a3、CommonB、SpecialBを保存しています。

しかし、それは起こりません..

4

1 に答える 1

2

を永続a1化すると、 も永続CommonB化され、そのオブジェクトに id が設定されます。永続化は、一度永続化されている間に再度a2永続化を試み ます。CommonBあなたのデータサービスはトランザクショナルであると想定しているため、永続化した後、a1TX を閉じ、Hibernate のセッションCommonBは分離されたオブジェクトになります。CommonB永続化する場合は、リロード (再接続) する必要がありa2ますa3

于 2013-09-11T09:19:44.297 に答える