Подтвердить что ты не робот

Что означает владелец отношений в двунаправленных отношениях?

У меня есть простая модель с объектами Question и Choice.

  • ОДИН ВОПРОС МНОГО ВЫБОРА (S).
  • МНОГО Выбор имеет ОДИН вопрос

Есть два способа реализовать это с помощью Hibernate

Реализация Одна: Сторона владельца - это выбор

Question.java

@OneToMany (mappedBy="question")
private Set choices = new HashSet();

Choice.java

@ManyToOne
@JoinColumn (name="QUESTION_ID")
private Question question;

Реализация 2: Сторона владельца - это вопрос

Question.java

@OneToMany
@JoinColumn (name = "QUESTION_ID")
private Set choices = new HashSet();

Choice.java

@ManyToOne
@JoinColumn (name="QUESTION_ID", updatable = false, insertable = false)
private Question question;

В чем разница между двумя реализациями?

4b9b3361

Ответ 1

Ваш первый пример - это нормальное и правильное двунаправленное сопоставление "один-ко-многим" / "много-к-одному". Установка Question в Choice -attribute ( "сторона владения" ) достаточно, чтобы отношения сохранялись. График сущности в памяти будет испорчен до тех пор, пока другая сторона отношения не будет снова прочитана из базы данных. Из владелец точки базы данных базы данных - это объект, который хранится в таблице, имеющей столбец внешнего ключа (тот же для двунаправленного взаимно однозначного). В спецификации это объясняется следующим образом:

Многие стороны двунаправленных отношений "один-ко-многим/много-к-одному" должна быть собственная сторона, поэтому элемент mappedBy не может быть указанная в аннотации ManyToOne.
....
Двунаправленный отношения между управляемыми объектами будут сохраняться на основе ссылки, которыми владеет владеющая сторона отношений. Это разработчики несут ответственность за сохранение в памяти ссылок, хранящихся на владеющая сторона и те, которые находятся на обратной стороне, согласуются с друг друга, когда они меняются. В случае однонаправленного одностороннего и отношения "один ко многим", ответственность разработчиков лежит на убедитесь, что семантика отношений соблюдается.

В терминах JPA ваш второй пример не имеет собственной стороны из-за отсутствия mappedBy. Вместо этого у вас есть два однонаправленных отношения, которые вынуждены использовать тот же столбец, что и хранилище. По крайней мере, с Hibernate 3.5.6 он будет вести себя следующим образом:

  • Установка Question в Choice -атрибут не будет сохраняться.
  • Добавление Choice в Question -трибут не будет сохраняться.
  • Чтобы сохранить значение "QUESTION_ID", оба параметра должны быть установлены (да, также не - insertable Question).