У меня двунаправленное отношение OneToMany / ManyToOne с использованием таблицы соединений. Дети в списке и упорядочены.
Вот настройки:
Родитель:
@OneToMany(cascade=CascadeType.ALL)
@JoinTable(
name="parent_child",
joinColumns=@JoinColumn(name="parent_id"),
inverseJoinColumns=@JoinColumn(name="child_id")
)
@OrderColumn(name="child_order")
public List<Child> getChildren() {
return children;
}
Ребенок:
@ManyToOne
public Parent getParent() {
return parent;
}
Вот моя проблема: родительская таблица соответствует ожиданиям, но вот таблицы child и parent_child:
ребенок:
int8 id,
int8 parent_id <---
parent_child:
int8 parent_id, <---
int8 child_id,
int8 child_order
Есть дублирование с parent_id - это указано в таблице соединений и в дочерней таблице, что означает, что можно вызвать parent.getChildren (). Get (0) .getParent () и в итоге получить другого родителя, чем вы. Началось с того, что должно быть невозможно (и я бы хотел, чтобы это выполнялось на уровне базы данных).
Единственный способ исправить это - использовать столбец соединения в дочернем элементе, а не использовать таблицу соединений вообще. Но мне это не нравится, потому что тогда я должен перенести заказ на ребенка, и в документах о гибернации говорится, что следует избегать JoinColumn с OneToMany (но на самом деле они не говорят, почему).
Есть ли другой способ избавиться от этого дублирования / возможного несоответствия? То есть каким образом ребенок может узнать своего родителя, используя данные из таблицы соединений?