Trouvé références partagées pour une collection org.mise en veille prolongée.HibernateException
J'ai eu ce message d'erreur:
erreur: on Trouve des références partagées pour une collection: Personne.relatedPersons
Quand j'ai essayé d'exécuter addToRelatedPersons(anotherPerson)
:
person.addToRelatedPersons(anotherPerson);
anotherPerson.addToRelatedPersons(person);
anotherPerson.save();
person.save();
Mon domaine:
Person {
static hasMany = [relatedPersons:Person];
}
une idée de pourquoi cela se produit ?
- J'ai couru dans la même exception, pour moi il a été causé par le fait d'avoir deux fois le même attribut dans le chemin d'héritage de ma classe d'entité
- J'ai rencontré le même problème que @kaefert (c'est à dire le même bien plus d'une fois dans le chemin d'héritage), mais je suis la seule exception, lorsque les mêmes critères a été exécuté deux fois (appel
list()
deux fois). Délicat.
Vous devez vous connecter pour publier un commentaire.
Hibernate affiche ce message d'erreur lorsque vous essayez de conserver le plus d'une instance d'entité de partage de la même collection de référence (à savoir le recouvrement de l'identité, en contraste avec la collection de l'égalité).
Noter qu'il signifie la même chose collection, pas de collecte de l'élément en d'autres termes
relatedPersons
sur les deuxperson
etanotherPerson
doit être le même. Vous êtes peut-être réinitialiser cette collection d'entités sont chargées? Ou vous avez initialisé à la fois des références avec la même instance de la collection?J'ai eu le même problème. Dans mon cas, le problème était que quelqu'un a utilisé BeanUtils copier les propriétés d'une entité à une autre, donc nous avons fini par avoir deux entités faisant référence à la même collection.
Étant donné que j'ai passé un peu de temps à l'examen de cette question, je vous conseille la liste de contrôle suivante:
Look pour les scénarios comme
entity1.setCollection(entity2.getCollection())
etgetCollection
retourne la référence interne à la collection (si getCollection() retourne une nouvelle instance de la collection, alors vous n'avez pas besoin de s'inquiéter).Regarder si
clone()
a été correctement mis en œuvre.Recherchez
BeanUtils.copyProperties(entity1, entity2)
.entity1.setCollection(entity2.getCollection())
. Je l'ai résolu enentity1.setCollection(new HashSet(entity2.getCollection()))
BeanUtils.copyProperties(oldRec, newRec)
dans "clone ()" la méthode. J'ai mis à jour leBeanUtils.copyProperties
de sauter le nouvellement ajoutéManyToMany
champBeanUtils.copyProperties(oldRec, newRec, newCollectionField)
.Explication sur la pratique. Si vous essayez d'enregistrer votre objet, par exemple:
vous n'avez pas besoin de mise à jour de l'objet à un objet parent:
Simple enregistrer votre objet parent comme:
Lecture en ligne la cause de cette erreur peut être aussi un hibernate bug, comme solution de contournement qu'il semble fonctionner, c'est de mettre un:
Vous devez mettre au clair après l'obtention de données et avant de s'engager et de fermeture, voir exemple:
J'utilise cette solution pour sélectionner la base de données, update ou insert je ne sais pas si cette solution peut fonctionner ou peut causer des problèmes.
Mon problème est égale à 100% de ce: http://www.progtown.com/topic128073-hibernate-many-to-many-on-two-tables.html
Dans mon cas, j'ai été de copier et de coller le code de mes autres classes, donc je n'ai pas remarqué que la lecture du code est mal écrit:
Toutes les références conceptoses mais si vous regardez le get dit letrases
Moi aussi j'ai eu le même problème, quelqu'un a utilisé
BeanUtils.copyProperties(source, target)
. Ici à la fois la source et la cible, utilisez la même collection comme attribut.Donc j'ai simplement utilisé la copie en profondeur comme ci-dessous..
Comment Cloner une Collection en Java - copie de la liste de tableaux et HashSet
J'ai affronté exception similaire dans mon application. Après avoir examiné la stacktrace il était clair que l'exception a été levée dans une
FlushEntityEventListener
classe.En veille prolongée 4.3.7 la
MSLocalSessionFactory
bean ne prend plus en charge leeventListeners
de la propriété. Par conséquent, on a explicitement de récupérer le registre du service de l'individu Hibernate beans de session, puis de régler le personnalisé des écouteurs d'événement.Dans le processus d'ajout d'événement personnalisé auditeurs, nous devons nous assurer que le correspondant par défaut des écouteurs d'événement sont supprimés à partir de la session Hibernate.
Si la valeur par défaut de l'écouteur d'événement n'est pas enlevé, puis, le cas échéant, de deux écouteurs d'événement enregistré à l'encontre même de l'événement. Dans ce cas, lors de l'itération sur ces écouteurs, contre les premiers auditeurs de toutes les collections de la session sera marqué comme étant atteint et pendant le traitement de la même collection contre le deuxième écouteur serait de se débarrasser de cette Hibernate exception.
Donc, assurez-vous que lors de l'enregistrement des modules d'écoute personnalisés par défaut correspondantes auditeurs sont supprimés de la base de registre.
Considérer une entité:
Et d'envisager une Logique de classes:
Ici l'utilisateur et
foo.getUser()
partagent la même référence. Mais l'enregistrement de deux références crée un conflit.L'utilisation correcte devrait être:
Cela évite le conflit.