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