1

私はこのようなオブジェクト階層を持っています (id、セッター/ゲッターなどのすべてのフィールドを無視します):

@Entity
class A {
    @OneToOne(cascade=CascadeType.ALL)
    private B b;
}

@Entity
class B {
    @OneToOne(cascade=CascadeType.ALL)
    private A a;

    @OneToOne(cascade=CascadeType.ALL)
    private C c;
}

@Entity
class C {
    private int x;
}

すべてのエンティティは@Id @GeneratedValue private Long id;

私は Hibernate と MySQL で JPA を使用しておりA、単純な処理を行う DAO を持っています。entityManager.merge(a); entityManager.flush();

現在、このコンストラクトは JSF プロジェクトで使用されています。ここでは、new を使用して new を作成しますAB、値Cはデータベースから取得されるため、既存のエンティティです。この新しく入力されたオブジェクトはページに表示され、保存ボタンをクリックしたときにのみ保存されるため、作成と保存は 2 つの異なるトランザクションで行われます。

を実行しようとすると、 in クラスの値がデータベースに既に存在するため、驚くことではありませんdao.save(a)org.hibernate.TransientObjectExceptioncB

実際の質問は次のとおりです。保存を手動でカスケードせずに、この問題を回避できますか? 私はB、それぞれが数十のCs を持つ数十の -type クラスについて話している - これは私のカスケードの考えに完全に反するだろう...

どんなアイデアでも大歓迎です!

4

2 に答える 2

0

次のようにして問題を回避しました。

では、すべての B クラスを取得Aするメソッドを作成しました。List<B> getBs()B、メソッドを作成しましたList<C> getCs()。今、道で私は

public void save(A a) {
    for (B b : a.getBs()) {
        for (C c : b.getCs()) {
            if (c != null) {
                if (c.getId() == null) {
                    entityManager.persist(c);
                } else {
                    entityManager.merge(c);
                }
            }
        }
    }
    super.save(a);
}

Bs とsを追跡するだけで済みますCが、オブジェクト ツリー全体をトラバースするよりはましです ...

于 2012-11-13T11:09:35.113 に答える
0

アノテーションによる問題が発生する可能性があります。このから、問題を解決するための助けを得ることができます。

于 2012-11-13T09:43:14.213 に答える