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 ...
    }
}    

每次我运行它时,数据库中都会添加两个孩子,而我只想要一个!
我究竟做错了什么 ?

Java 6
JPA 2
休眠 3.6.8.GA

4

2 回答 2

2

您是否有机会在父母之后坚持孩子?此外,最佳实践是仅在关系的拥有方管理对象的链接(在一种方法中同时使用 parent.addChild 和 child.setParent),但这在您的情况下似乎并不重要,因为在“合并”发生时,对象已正确链接。如果这些都不起作用,那么您可能会遇到这个问题:https ://hibernate.onjira.com/browse/HHH-5855

于 2012-06-25T10:12:32.633 回答
1

我阅读了 Hibernate 文档,这确实令人困惑并且对我没有多大帮助。

请注意,我发现 ObjectDB 最近遇到并修复了完全相同的错误。(Hibernate 伙计们,你们为什么要等这么久??)

尽管如此,我想出的解决方案是:

步骤 1:
创建一个新的子节点(即处于分离状态)并调用其 setParent 方法以链接到其父节点。

第2步:
坚持这个孩子。

第 3 步:
根据需要对子项进行更改,然后将其合并。

该解决方案并不优雅,但它确实有效!接下来,您将获取您的父对象,它将手动将先前的子对象链接到它。

于 2012-06-25T16:12:35.793 回答