La sauvegarde/mise à jour de l'objet avec hibernate
Ma classe Foo a la méthode:
protected void saveMany(Collection<T> many) {
for(Object one : many) {
one = session.merge(one); //also tried this commented out
session.saveOrUpdate(one); //session.merge(one);
}
Essayé d'utiliser saveOrUpdate et également de fusionner, mais les deux m'ont donné cette exception:
Error: Invocation of method 'saveMany' in class Foo threw exception class org.hibernate.HibernateException : org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [Bar#581301]
Comment résoudre ce problème?
Note de côté:
Quand je tronquer ma table, le gain en partie fonctionne, mais quand j'ai le tableau rempli, et exécutez une nouvelle fois cette méthode, donc la mise à jour de la table, il ne parvient pas, avec cette exception
Lorsque vous avez appelé
non je n'ai pas l'appeler saveOrUpdate à tous, je viens d'appeler la fusion. Tu veux dire quelque chose comme cela?
Je l'ai fait :
stackoverflow.com/questions/1074081/...
Bon, je crois que j'ai trouvé d'où cela se passe, mais comment puis-je obtenir la première instance de l'objet de hibernate contexte?
merge()
avez-vous pensé à appeler saveOrUpdate()
après, à l'exemple retourné de la fusion() et ne pas l'instance que vous avez passé en fusion() comme paramètre? Voir ma réponse icinon je n'ai pas l'appeler saveOrUpdate à tous, je viens d'appeler la fusion. Tu veux dire quelque chose comme cela?
session.saveOrUpdate(session.merge(one))
, il dit : The left-hand side of an assignment must be a variable
Je l'ai fait :
one = session.merge(one); session.saveOrUpdate(one);
stackoverflow.com/questions/1074081/...
Bon, je crois que j'ai trouvé d'où cela se passe, mais comment puis-je obtenir la première instance de l'objet de hibernate contexte?
OriginalL'auteur Jaanus | 2012-08-13
Vous devez vous connecter pour publier un commentaire.
Si vous avez une instance détachée d'une Classe avec
@Id
qui existe déjà dans la Session Hibernate cache, alors vous aurez à les appelermerge()
de fusionner l'instance détachée dans le cache. Ensuite, vous devez appelersaveOrUpdate()
.Mais vous devez faire attention à conserver l'instance retourné de l'appel à la fusion() et ne pas l'instance passée en tant que paramètre. Afin de vous code doit ressembler à ceci
Si vous êtes d'exploitation à l'intérieur d'une transaction de la base de données ne sera pas mis à jour jusqu'à la fin de la session et de la validation de la transaction, ou vous appeler explicitement
flush()
OriginalL'auteur Brad
Il est dit que vous essayez d'enregistrer un nouvel objet dont l'Id est déjà utilisé par un autre.
Probablement, vous n'avez pas correctement mis en œuvre
equals
ethashCode
. Donc, hibernate trouve que vous souhaitez enregistrer Objet2 avec id1, et dans la base de données n'est Objet2 avec id1, mais pasObject2.equals(Object1)
Mais est-ce que votre objet implémenter equals()? Même si c'est juste égal de l'id. Dans un cours sur la JPA (ok, pas de mise en veille prolongée) m'a dit que vous devez implémenter equals pour que cela fonctionne.
Non il ne marche pas, pouvez-vous me donner un lien sur ce que tu veux dire? Je n'ai pas d'égal nulle part.
community.jboss.org/wiki/EqualsandHashCode; stackoverflow.com/questions/5031614/...; stackoverflow.com/questions/4388360/...
Wow, c'est vraiment déroutant et je ne comprends vraiment pas, pourquoi je dois faire un autre identifiant, quand j'ai reçu la clé primaire.
OriginalL'auteur SJuan76
Vous êtes probablement en train de Sauver
List<T>
qui a un ou plusieurs objets est égal à.Utilisation SaveOrUpdate ou de fusion pour le résoudre ou simpply essayer de faire de tous les objets uniques.
T
. J'ai essayé à l'aide de fusion et saveOrUpdate comme on le voit dans le post initial.Vous êtes de passage à la Collection de<T>, et la Liste s'étend de la Collection de<T>, de sorte que votre Collection a des doublons. Essayez de supprimer les doublons.
Pourrait-il être le problème que ma méthode a 2 collections pour les arguments comme cela :
saveMany(Collection<T> update, Collection<T> delete)
. J'ai enlevé un de code initial pour simplifier les choses.OriginalL'auteur danny.lesnik
Vous avez plusieurs versions de "une" dans la mémoire cache de votre Hibernatesessions!
Vous devez trouver les occurrences de "un" et de supprimer le cache de l'information à partir de la Hibernatesessions à l'aide ".expulser(...)".
Je pense que je suis en train de faire cela, mais je ferme ma dernière session.
proche!!!! = expulser. La référence à la "une" et la fermeture de session est toujours donné! Ce que les isc du Système..println(un.getClass()) ?
OriginalL'auteur Peter Rader