У меня проблема при удалении элементов из списка, сопоставленного, как описано выше. Вот сопоставление:
@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 удаляет строку сопоставления с ПОСЛЕДНИМ индексом и пытается обновить оставшиеся, начиная с первого).
Что не так с отображением выше?