Ho un problema durante la rimozione di elementi da un elenco mappato come descritto sopra. Ecco la mappatura:Violazione del vincolo in Hibernate OneToMany unidirezionale Mapping con JoinTable e OrderColumn durante la rimozione degli elementi
@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; } }
Inserimento Bar-istanze e salvare il Foo funziona bene, ma quando rimuovo un elemento dall'elenco e salvare di nuovo, il vincolo univoco sulla bar_id nella tabella di mappatura viene violato. Le seguenti dichiarazioni di SQL sono emessi da Hibernate, e questi sembrano piuttosto strano:
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"
L'errore rende perfettamente senso, date le istruzioni generate da Hibernate (ci sono cinque elementi della lista, ho rimuovere il primo e Hibernate cancella la riga di mappatura con l'indice LAST e tenta di aggiornare i restanti, iniziando dal primo).
Cosa c'è di sbagliato nella mappatura sopra?
Grazie, sì, questo è quello che ho scoperto anche dopo un po 'di tempo trascorso nel debugger. Come una correzione sto usando ManyToMany (che abbassa il vincolo di unicità), ma mi sembra brutto. È interessante notare che nessun altro si è imbattuto in questo problema, poiché considererei questo caso di uso comune ... – tbk
@tbh Sì, rendendo l'associazione un numero molti-a-molti eliminerà il vincolo univoco (per consentire "molti "). Ma questa è davvero una soluzione, Hibernate dovrebbe gestire correttamente uno-a-molti. Potresti voler votare per il problema Jira :) –