JPA / Hibernate OnetoMany предотвращает дублирование детей - PullRequest
0 голосов
/ 04 апреля 2019

В этой теме есть несколько разных вопросов, ответы на которые есть, но из того, что я вижу, многие ответы устарели или не имеют для меня никакого смысла.

Допустим, у меня есть 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 

Создается два экземпляраребенка в таблице с разными идентификаторами.Я понимаю, что это потому, что различные экземпляры Child создаются, а затем сохраняются отдельно.

Но как мне изменить мой дизайн, чтобы сохранить и сослаться только на один экземпляр двух идентичных потомков?Я попытался построить ребенка, а затем отдать его родителям, но затем я получил ошибку первичного ключа.

1 Ответ

2 голосов
/ 04 апреля 2019

Вместо вашего конструктора возьмите ребенка:

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

Если вы хотите применить уникальность для метки на потомке, измените определение столбца на потомке

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

Если более одного родителя должны ссылаться на одного и того же потомка, вам может понадобиться использовать ссылку на тип ManyToMany вместо «Один ко многим».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...