Нарушение ограничения в однонаправленном сопоставлении OneToMany Hibernate с 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 удаляет строку сопоставления с ПОСЛЕДНИМ индексом и пытается обновить оставшиеся, начиная с первого).

Что не так с отображением выше?

16
задан Pascal Thivent 26 October 2010 в 20:38
поделиться