Violation de contrainte en mode veille prolongée unidirectionnel OneToMany avec cartographie JoinTable et OrderColumn lors de la suppression d'éléments

J'ai un problème lors de la suppression d'éléments d'une liste mappé comme décrit ci-dessus. Voici la cartographie:

@Entity 
@Table( name = "foo") 
class Foo { 

Liste privée bars; 

@OneToMany 
@OrderColumn( name = "order_index" ) 
@JoinTable( name = "foo_bar_map", joinColumns = @JoinColumn( name = "foo_id" ), inverseJoinColumns = @JoinColumn( name = "bar_id" ) ) 
@Fetch( FetchMode.Sous-sélection ) 
Liste publique getBars() { 
retour bars; 
} 
} 

L'insertion de la Barre-les instances et l'enregistrement de la Foo fonctionne bien, mais lorsque je supprime un élément de la liste et de les enregistrer à nouveau, la contrainte unique sur bar_id dans la table de correspondance est violé. La suite de commandes SQL sont émis par hibernate, et ceux-ci semblent tout à fait bizarre:

JOURNAL: exécuter : suppression de foo_bar_map où foo_id=1$et order_index=$2 
DÉTAIL: les paramètres: $1 = '4', $2 = '6' 
JOURNAL: exécuter S_5: mise à jour foo_bar_map ensemble bar_id=$1 où foo_id=2$et order_index=$3 
DÉTAIL: les paramètres: $1 = '88', $2 = '4', $3 = '0' 
ERREUR: la valeur de clé en double viole la contrainte unique "foo_bar_map_bar_id_key" 

L'erreur est parfaitement logique, compte tenu des déclarations générées par Hibernate (il y a cinq éléments dans la liste, j'ai supprimer le premier et Hibernate supprime la rangée de mappage avec le DERNIER indice et la tente pour les mises à jour les autres, en commençant par la première).

Quel est le problème avec la cartographie ci-dessus?

OriginalL'auteur tbk | 2010-10-26