10
votes

HibernateException: Trouvé deux représentations de la même collection

Si je sauvegarde un objet contenant la liste suivante xxx

i obtenir l'exception xxx

le code dans la pièce! contrôleur ressemble à ceci: xxx

si j'insère TaskList.refresh () Avant ce bloc, mais les informations de position sont perdues (ce qui conduit à d'autres erreurs).

est-ce un bogue hibernate ou est quelque chose qui ne va pas avec mon code?


0 commentaires

7 Réponses :


0
votes

Si vous avez besoin de la liste à persister, vous devrez peut-être annoter votre liste avec @onetomanany pour pouvoir persister votre entité.


1 commentaires

Vous avez raison. J'ai laissé cette annotation pour raccourcir mon exemple - probablement une mauvaise idée.



13
votes

Le problème était que Hibernate ne prend pas en charge la combinaison de @onetomany (mappeby = ...) et @ordordcolumn . Sans mappé Hibernate utilise une table de jointure et tout fonctionne comme prévu. Voir Explication .


0 commentaires

-1
votes

Le problème est avec votre jointure Vérifiez si vous n'agissez pas de données qui ne sont pas dans la table


0 commentaires

0
votes

Une autre raison de l'exception "org.hibernate.hibernateException: trouvé deux représentations de la même collection" est des getters / setters dupliqués dans l'entité.


0 commentaires

2
votes

La même erreur se produit lorsque vous essayez de modifier une collection associée d'un objet. e.g.:

    MyObject myObject = myObjectService.get(id);
    List<Task> newTasks = //populate new list of Task here
    myObject.setTasks(new List<Task>); // or myObject.getTasks().clear();
    myObject.getTasks().addAll(newTasks);
    myObjectService.merge(myObject); 

Pièce aussi, il peut être résolu par: p> xxx pré> p>


0 commentaires

0
votes

Après de nombreuses heures, j'ai trouvé la solution, j'ai eu le même problème.

J'ai eu une entitélistener avec ce code dans mon app xxx

ceci causait l'exception dans une collection aléatoire (ou ressemble à) d'une autre entité indépendante qui participait à la même transaction. Je ne connais pas la raison exacte mais ajoutant @TransAderal (propagation = propagation.requires_new) corrige le problème

peut-être que hibernate ne veut pas que vous modifiez l'entité à la main, Mais le champ était un champ transitoire ...


0 commentaires

1
votes

Je pourrais résoudre le problème en modifiant l'association à paresseux code> et en supprimant la cascade.

@OneToMany(mappedBy="taskList", fetch = FetchType.LAZY)
@OrderColumn(name="position", nullable=false)
public List<Task> tasks = new ArrayList<Task>();


1 commentaires

Suppression de FETCHTYPE.EAIGER a travaillé pendant tout en conservant le cascadeType.Toutes l'opération.