У меня проблема при удалении элементов из списка, отображаемого, как описано выше. Вот отображение:Нарушение ограничений в однонаправленном однонаправленном однонаправленном однонаправленном сопоставлении OneToMany с элементами JoinTable и OrderColumn при удалении элементов
@Entity @Table(name = "foo") class Foo { private List bars; @OneToMany @OrderColumn(name = "order_index") @JoinTable(name = "foo_bar_map", joinColumns = @JoinColumn(name = "foo_id"), inverseJoinColumns = @JoinColumn(name = "bar_id")) @Fetch(FetchMode.SUBSELECT) public List getBars() { return bars; } }
Вставка Bar-экземпляры и спасая Foo работает отлично, но когда я удалить элемент из списка и сохранить снова, уникальное ограничение на bar_id в таблице отображения нарушается. Следующий SQL-операторы выданный спящего режимом, и они выглядят довольно странно:
LOG: execute : delete from foo_bar_map where foo_id=$1 and order_index=$2 DETAIL: parameters: $1 = '4', $2 = '6' LOG: execute S_5: update foo_bar_map set bar_id=$1 where foo_id=$2 and order_index=$3 DETAIL: parameters: $1 = '88', $2 = '4', $3 = '0' ERROR: duplicate key value violates unique constraint "foo_bar_map_bar_id_key"
ошибка совершенно имеет смысл, учитывая заявления, генерируемых Hibernate (есть пяти элементов в списке, я удалить первую и Hibernate удаляет строку сопоставления с индексом LAST и пытается обновить оставшиеся, начиная с первого).
Что не так с изображением выше?
Спасибо, да, это то, что я также узнал после довольно долгого времени, проведенного в отладчике. В качестве исправления я теперь использую ManyToMany (который снижает ограничение уникальности), но он кажется уродливым. Интересно, что никто другой не столкнулся с этой проблемой, так как я считаю это распространенным прецедентом ... – tbk
@tbh Да, чтобы ассоциация «многие-ко-многим» упустила уникальное ограничение (чтобы позволить «многим» «). Но это действительно обходной путь, Hibernate должен правильно обращаться с одним-ко-многим. Возможно, вы захотите проголосовать за вопрос Джиры :) –