JPA - проблема OneToMany, ManyToOne, OneToOne - PullRequest
2 голосов
/ 04 августа 2011

Учитывая следующие две сущности:

class Parent {
       @OneToMany(cascade=CascadeType.ALL)
       private Set<Child> children;

       (...)
}


class Child {
       @ManyToOne
       private Parent parent;

       (...)
}

Я хотел бы две таблицы в базе данных.Один стол для родителей, а другой для детей.Но Hibernate создает три таблицы: одну для родителей, одну для детей и одну для их объединения (таблица с двумя полями).

Даже если я добавлю @OneToOne к родительскому атрибуту в классе Child, я по-прежнемуполучить тот же результат.

Что мне не хватает?

Ответы [ 3 ]

3 голосов
/ 04 августа 2011

Добавьте свойство mappedBy к @OneToMany в классе Parent. Это делает Child стороной-владельцем.

В Child добавьте аннотацию @JoinColumn в поле parent, чтобы объявить имя столбца внешнего ключа в дочерней таблице.

Из JavaDoc на @OneToMany#mappedBy:

Поле, которому принадлежат отношения. Требуется, если отношения не являются однонаправленными.

Однонаправленным отношениям нужна таблица соединений, но в вашем случае она двунаправленная, поэтому требуется.

2 голосов
/ 04 августа 2011

учитывая, что ваш столбец внешнего ключа в таблице детей называется "parent_id", попробуйте

@OneToMany(mappedBy="parent")
private Set<Child> children;

и

@ManyToOne
@JoinColumn(name="parent_id")
private Parent parent;
2 голосов
/ 04 августа 2011

Атрибут mappedBy = "parent" в аннотации отсутствует для построения двунаправленной ассоциации.

class Parent {
   @OneToMany(mappedBy="parent",cascade=CascadeType.ALL)
   private Set<Child> children;

   (...)
}

class Child {
   @ManyToOne
   private Parent parent;

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