Ваше отображение полностью корректно и работает с EclipseLink как реализация JPA 2.0 (конечно, без аннотации Fetch
), но на самом деле не работает с Hibernate.
Вот DDL с Hibernate:
create table foo_bar_map (foo_id bigint not null, bar_id bigint not null, order_index integer not null, primary key (foo_id, order_index), unique (bar_id))
alter table foo_bar_map add constraint FK14F1CB7FA042E82 foreign key (bar_id) references Bar4022509
alter table foo_bar_map add constraint FK14F1CB7B6DBCCDC foreign key (foo_id) references Foo4022509
Допустим, Foo#1
содержит список с Bar#1
, Bar#2
, Bar#3
, таблица соединения содержит:
foo_id | bar_id | order_index
1 | 1 | 1
1 | 2 | 2
1 | 3 | 3
При удалении, скажем, первого элемента из списка, Hibernate сначала delete
последняя строка (WTF?) Из таблицы объединения:
foo_id | bar_id | order_index
1 | 1 | 1
1 | 2 | 2
А затем пытается update
столбец bar_id
в объединяемой таблице вместо order_index
(WTF !?) для отражения «нового» порядка элементов в списке.Первый (схематично):
foo_id | bar_id | order_index
1 | 2 | 1
1 | 2 | 2
, где следующий шаг приведет к:
foo_id | bar_id | order_index
1 | 2 | 1
1 | 3 | 2
Очевидно, что этот подход не звучит правильно и не работает из-за ограничения unique
на bar_id
.В более общем смысле, почему, черт возьми, Hibernate связывается с bar_id
вместо обновления столбца order_index
?
Я считаю, что это ошибка Hibernate (сообщается как HHH-5694 , см. HHH-1268 сейчас).