Удалите дублирование в двунаправленных отношениях OneToMany / ManyToOne, используя JoinTable (с OrderColumn) - PullRequest
2 голосов
/ 11 декабря 2010

У меня двунаправленное отношение 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 (но на самом деле они не говорят, почему).

Есть ли другой способ избавиться от этого дублирования / возможного несоответствия? То есть каким образом ребенок может узнать своего родителя, используя данные из таблицы соединений?

Ответы [ 3 ]

1 голос
/ 11 декабря 2010

Попробуйте, если это работает.Обратите внимание на использование JoinColumn

   @OneToMany(cascade=CascadeType.ALL)
   @OrderColumn(name="child_order")
   public List<Child> getChildren() {
         return children;
   }

child

   @ManyToOne
   @JoinColumn("parent_id")
   public Parent getParent() {
       return parent;
   }
0 голосов
/ 08 сентября 2011

Я отвечаю на аналогичный вопрос в Нарушение ограничения в однонаправленном отображении OneToMany в Hibernate с JoinTable и OrderColumn при удалении элементов

Пожалуйста, посмотрите
Я думаю, что ваши ограничения на таблицу ассоциаций плохие и несовместимы с принципом Списка.

0 голосов
/ 13 марта 2011

Есть дублирование с parent_id - это указано в таблице соединений и в дочерней таблице, что означает, что можно вызвать parent.getChildren (). Get (0) .getParent () и получить другойродитель, чем вы начали с

Я не понимаю, как это возможно, когда у ребенка может быть только один родитель.Должна быть одна и только одна запись int database для данного кортежа parent-child, и дочерний элемент никогда не будет существовать ни в одном другом кортеже parent-child.Конечно, родитель будет повторяться в таблице parent_child, но никогда не будет повторяться потомком.Вы указали ограничения внешнего ключа для таблиц базы данных?Используйте элемент mappedBy в методе getParent ().

...