JPA / Hibernate OnetoMany可以防止重复的孩子

时间:2019-04-04 14:26:06

标签: java hibernate jpa

围绕该主题有一些不同的问题已经给出了答案,但是从我看来,很多答案对我而言都是过时的或不明确的。

假设我有一个Entity / Table

@Entity
@Table(name = "ParentTable")
public class Parent {

    @Id
    @GeneratedValue
    private Integer id;

    @OneToMany(cascade = CascadeType.ALL)
    @NotNull
    private List<Child> children;

    public Parent(String childLabel){
        this.children = new ArrayList<>();
        this.children.add(new Child(childLabel));
    }

    // Get/Set/Constructors

}

然后将Child设置为:

@Entity
public class Child {

    @Id
    @GeneratedValue
    private Integer id;

    @NotNull
    private String label;

    public Child(String label){
         this.label = label;
    }

    // Get/Set/Constructors

}

然后我通过以下方式构造一些父母

String childLabel = "child-label";
Parent a = new Parent(childLabel);
Parent b = new Parent(childLabel);
// Save both parents to a db 

它将在表中创建具有不同ID的子项的两个实例。我知道这是因为正在创建Child的不同实例,然后分别保存。

但是我应该如何更改设计以确保仅保存和引用两个相同子代的一个实例?我尝试过构造孩子,然后交给父母,但随后出现主键错误。

1 个答案:

答案 0 :(得分:2)

更改您的构造函数以改为使用Child:

public Parent(Child childLabel){
    this.children = new ArrayList<>();
    this.children.add(childLabel);
}

如果您要对Child上的标签强制执行唯一性,请在Child中更改列定义

@Column(unique=true, nullable=false)
private String label;

如果多个家长需要引用同一个孩子,那么您可能需要使用ManyToMany类型引用而不是一对多。