0

これが私のコードです

@Entity
class Parent extends Person {
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true, mappedBy = "father")
    private List<Child> children;

    // ...

    public void addChild(Child c) {
        children.add(c);
    }

}

@Entity
class Child extends Person {
    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name = "id")
    private Parent father;

    public Child() {
        this(NoParent.getInstance());//
    }

    public Child(Parent p) {
        super();
        setParent(p);
    }

    // ...
}

@MappedSuperclass
class Person {
    @Id
    private Integer id;
    private String name;
}

class MyParentService {

    public void addChild(String name, Parent parent) {
        Child c = new Child(parent);
        c.setName(name);
        parent.addChild(c);

        em.getTransaction.begin();
        em.merge(parent);
        em.getTransaction.commit();// Here two children with same name but different ids are created ...
    }
}    

実行するたびに、2 つの子がデータベースに追加されますが、1 つだけ必要です。
私は何を間違っていますか?

Java 6
JPA 2
休止状態 3.6.8.GA

4

2 に答える 2

2

ひょっとして、親の後に子を固執していませんか? また、ベスト プラクティスは、関係の所有側でのみオブジェクトのリンクを管理することです (1 つのメソッドで parent.addChild と child.setParent の両方を使用)。オブジェクトは、「マージ」が発生するまでに適切にリンクされています。これらのいずれも機能しない場合は、これを実行している可能性があります: https://hibernate.onjira.com/browse/HHH-5855

于 2012-06-25T10:12:32.633 に答える
1

本当に混乱していてあまり役に立たなかったHibernateのドキュメントを読みました。

注意してください、私は ObjectDB が最近直面し、まったく同じバグを修正したことを発見しました。(休止状態の皆さん、なぜそんなに長く待っているのですか??)

それにもかかわらず、ここで私が思いついた解決策:

ステップ 1:
新しい子を作成し (つまり、切り離された状態で)、その setParent メソッドを呼び出して親にリンクします。

STEP 2:
この子をしつこくする。

ステップ 3:
必要に応じて child に変更を加え、後でマージします。

解決策はまったくエレガントではありませんが、うまくいきます!次に、親オブジェクトをフェッチします。これには、以前の子 (ren) が手動でリンクされています。

于 2012-06-25T16:12:35.793 に答える