Einschränkungsverletzung beim unidirektionalen OneToMany-Mapping im Ruhezustand mit JoinTable und OrderColumn beim Entfernen von Elementen

Ich habe ein Problem beim Entfernen von Elementen aus einer Liste, die wie oben beschrieben zugeordnet wurde. Hier ist das Mapping:

@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;
    }
}

as Einfügen von Bar-Instanzen und das Speichern von Foo funktioniert einwandfrei. Wenn ich jedoch ein Element aus der Liste entferne und erneut speichere, wird die eindeutige Einschränkung für bar_id in der Zuordnungstabelle verletzt. Die folgenden SQL-Anweisungen werden von hibernate ausgegeben und sehen ziemlich seltsam aus:

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"

Der Fehler macht angesichts der von Hibernate generierten Anweisungen durchaus Sinn (es gibt fünf Elemente in der Liste, ich entferne das erste und Hibernate löscht die Zuordnungszeile mit dem LETZTEN Index und versucht, die verbleibenden zu aktualisieren, beginnend mit dem ersten ).

Was stimmt nicht mit dem obigen Mapping?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage