Hibernate Erreur: org.mise en veille prolongée.NonUniqueObjectException: un objet différent avec le même identifiant de la valeur a déjà été associé à la session
J'ai deux Objets utilisateur et alors que j'essaie d'économiser de l'objet à l'aide
session.save(userObj);
J'obtiens l'erreur suivante:
Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:
[com.pojo.rtrequests.User#com.pojo.rtrequests.User@d079b40b]
Je suis de la création de la session à l'aide de
BaseHibernateDAO dao = new BaseHibernateDAO();
rtsession = dao.getSession(userData.getRegion(),
BaseHibernateDAO.RTREQUESTS_DATABASE_NAME);
rttrans = rtsession.beginTransaction();
rttrans.begin();
rtsession.save(userObj1);
rtsession.save(userObj2);
rtsession.flush();
rttrans.commit();
rtsession.close(); //in finally block
J'ai aussi essayé de faire la session.clear()
avant de l'enregistrer, toujours pas de chance.
C'est pour la première fois je suis l'objet de session lorsqu'un utilisateur demande vient, alors je suis pourquoi est dire que l'objet est présent dans la session.
Des suggestions?
- Voici un autre fil merveilleux qui a aidé à résoudre mon problème getj2ee.over-blog.com/...
Vous devez vous connecter pour publier un commentaire.
J'ai eu cette erreur plusieurs fois et il peut être assez difficile à traquer...
Fondamentalement, ce que hibernate est en train de dire que vous avez deux objets qui ont le même identifiant (même clé primaire), mais ils ne sont pas le même objet.
Je vous suggère de briser votre code, c'est à dire en commentaire bits jusqu'à ce que l'erreur disparaisse, puis mettre le code jusqu'à ce qu'il revienne et vous devriez trouver l'erreur, il.
Le plus souvent, passe par en cascade enregistre où il y a une cascade d'économiser entre l'objet A et de B, mais l'objet B a déjà été associé à la session, mais pas sur la même instance de B.
Quelle est la principale clé de générateur utilisez-vous?
La raison pour laquelle je demande, c'est cette erreur est liée à la façon dont vous dites à hibernate de vérifier la persistance de l'état d'un objet (c'est à dire si un objet est persistant ou non). Cette erreur peut se produire en raison d'hibernate est d'essayer de persister et de l'objet qui est déjà persistant. En fait, si vous utilisez la commande enregistrer hibernate va essayer et à la persistance de cet objet, et peut-être qu'il est déjà un objet avec la même clé primaire associée à la session.
Exemple
En supposant que vous avez une hibernate objet de classe pour un tableau de 10 lignes en fonction d'une clé primaire combinaison (colonne 1 et colonne 2). Maintenant, vous avez supprimé 5 lignes de la table à un moment donné du temps. Maintenant, si vous essayez d'ajouter le même 10 rangées de nouveau, tandis que hibernate essaie conserver les objets dans la base de données, 5 lignes qui ont déjà été supprimés seront ajoutés sans erreurs. Maintenant, le solde de 5 lignes qui sont déjà existants, permettra de lever cette exception.
De sorte que la simple approche serait de vérifier si vous avez mis à jour/supprimer une valeur dans un tableau qui est une partie de quelque chose et, plus tard, êtes-vous essayer d'insérer les objets mêmes de nouveau
Ce n'est qu'un point où hibernate fait de plus en plus de problèmes qu'elle n'en résout.
Dans mon cas, il y a de nombreux objets avec le même identifiant 0, parce qu'ils sont nouveaux et n'en ont pas. La db génère. Quelque part j'ai lu que les signaux 0 Id n'est pas définie. La manière intuitive pour les conserver est une itération sur eux et de dire hibernate pour enregistrer les objets. Mais Vous ne pouvez pas le faire - "bien sûr, Vous devriez savoir que hibernate fonctionne de cette et de cette façon, donc il faut..."
Alors maintenant, je peux essayer de modifier l'Id de Long au lieu de long et de regarder si elle travaille ensuite.
En fin de compte, il est plus facile de le faire avec un simple mappeur par votre propre, parce que hibernate est juste un additionnel opaques fardeau.
Un autre exemple: Essayer de lire les paramètres d'une base de données et les conserver dans une autre vous oblige à faire presque tout le travail manuellement. Mais si vous devez le faire de toute façon, l'utilisation d'hibernate est juste un travail supplémentaire.
Utilisation
session.evict(object);
La fonction deevict()
méthode est utilisée pour supprimer une instance de la cache de session. Donc, pour la première fois l'enregistrement de l'objet ,enregistrer l'objet en appelantsession.save(object)
méthode avant de les expulser, l'objet de la cache. De la même façon mettre à jour l'objet en appelantsession.saveOrUpdate(object)
ousession.update(object)
avant d'appeler evict().Cela peut se produire lorsque vous avez utilisé la même objet de session pour lire & écrire. Comment?
Disons que vous avez créé une session.
Vous lisez un enregistrement de l'employé de la table avec une clé primaire Emp_id=101
Maintenant que Vous avez modifié l'enregistrement en Java.
Et vous allez économiser de l'enregistrement de l'Employé dans la base de données.
nous n'avons pas fermé la session de nulle part ici.
Comme l'objet qui a été lu à persister dans la session. Il est en conflit avec l'objet que l'on souhaite écrire. D'où cette erreur vient.
Comme quelqu'un l'a déjà signalé ci-dessus que j'ai rencontré ce problème quand j'ai eu
cascade=all
sur les deux extrémités d'unone-to-many
relation, supposons donc Un --> B (un-à-plusieurs dans Un et plusieurs-à-un à partir de B) et a été mise à jour instance de B en A et en appelant ensuite saveOrUpdate(Un) , cela s'est traduit par une circulaire enregistrer la demande-je.e économisez de l'Un des déclencheurs d'économiser de B qui déclenche l'enregistrement d'Un... et dans le troisième exemple que l'entité( A) a essayé d'être ajouté à la sessionPersistenceContext la duplicateObject exception a été levée.j'ai pu le résoudre par la suppression en cascade à partir d'une extrémité.
J'ai aussi rencontré ce problème et a eu un moment difficile de trouver l'erreur.
Le problème que j'avais était la suivante:
L'objet a été lu par un Dao avec une autre session hibernate.
Pour éviter cette exception, il suffit de le re-lire l'objet avec le dao qui va enregistrer/mettre à jour cet objet plus tard.
donc:
Espère que sauver certaines personnes beaucoup de temps!
J'ai rencontré ce problème par:
Je l'ai résolu en vidant les résultats après le supprimer et d'effacer le cache avant l'enregistrement d'un nouvel objet
Obtenir l'objet à l'intérieur de la session, voici un exemple:
Vous pouvez utiliser
session.merge(obj)
, si vous faites enregistrer avec différentes sessions avec le même identificateur d'objet persistant.Il a travaillé, j'ai eu le même problème avant.
Sont vos Id mappages correct? Si la base de données est responsable de la création de l'Id par le biais d'un identifiant, vous devez mapper votre userobject à ...
J'ai rencontré ce problème avec la suppression d'un objet, ni expulser ni bien aidé.
Vérifier si vous avez oublié de mettre @GenerateValue pour @colonne Id.
J'ai eu le même problème avec de nombreux de nombreux de la relation entre le Film et le Genre. Le programme a jeté
Hibernate Erreur: org.mise en veille prolongée.NonUniqueObjectException: un objet différent avec le même identifiant de la valeur a déjà été associé à la session
erreur.
J'ai découvert plus tard que j'ai juste à faire en sorte que vous avez @GenerateValue à la GenreId méthode get.
il suffit de vérifier l'id de savoir si elle prend la valeur null ou 0 comme
en ajouter ou mettre à jour où le contenu est défini à partir de la forme de Pojo
Je suis nouveau sur NHibernate, et mon problème est que j'ai utilisé une autre session, à la requête de mon objet que j'ai fait pour le sauver. Si l'enregistrement de la session ne savais pas à propos de l'objet.
Cela semble évident, mais à la lecture de la réponse à la question précédente, j'ai été à la recherche partout pour 2 objets, pas les 2 sessions.
@GeneratedValue(stratégie=GenerationType.D'IDENTITÉ), l'ajout de cette annotation à la clé primaire de la propriété dans votre entity bean devrait résoudre ce problème.
J'ai résolu ce problème .
En fait ce qui se passe parce que nous avons oublié de mise en œuvre de Générateur Type de PK propriété dans la classe d'haricot. Afin de rendre n'importe quel type comme
quand nous persévérons les objets de haricot ,chaque objet acquis même ID ,de sorte que l'objet premier est sauvé ,lorsqu'un autre objet persistent alors HIB FW par le biais de ce type de
Exception: org.hibernate.NonUniqueObjectException:
un objet différent avec le même identifiant de la valeur a déjà été associé à la session.avant la position où répétitive des objets de commencer , vous devez fermer la session
et alors vous devriez commencer une nouvelle session
donc, dans cette façon dans une session, il n'y a pas plus d'une des entités qui ont le même identifiant.
Le problème se produit parce que dans la même session hibernate vous essayez d'enregistrer deux objets avec le même identificateur.Il y a deux solutions:-
Ce qui se passe parce que vous n'avez pas configuré votre mapping.xml fichier correctement pour les id des champs comme ci-dessous:-
La surcharge de la méthode getsession à accepter un Paramètre comme la isSessionClear,
et effacer la séance, avant de revenir à la session en cours, comme ci-dessous
Cela va provoquer les objets de session pour être effacé et même si hibernate ne pas générer un identifiant unique ,en supposant que vous avez configuré votre base de données correctement pour une clé primaire en utilisant quelque chose comme Auto_Increment,il doit travailler pour vous.
J'ai eu un problème similaire. Dans mon cas, j'avais oublié de définir le
increment_by
valeur dans la base de données pour être le même que celui utilisé par lecache_size
etallocationSize
. (Les flèches pointent vers le mentionné attributs)SQL:
Java:
Autrement que ce que wbdarby dit, il peut même se produire lorsqu'un objet est récupéré par le don de l'identificateur de l'objet à un HQL. Dans le cas de la tentative de modifier les champs d'objet et de le sauver de nouveau en DB(modification pourrait être insérer, supprimer ou mettre à jour) au cours de la même session, cette erreur apparaît. Essayez d'effacer la session hibernate avant d'enregistrer vos modifications de l'objet ou de créer une image de marque nouvelle session.
Espère que j'ai aidé 😉
J'ai la même erreur, j'ai été le remplacement de mon Jeu avec un nouveau obtenir de Jackson.
Pour résoudre ce je garder l'existant, - je retirer de l'ancienne série de l'élément inconnu dans la nouvelle liste avec
retainAll
.Puis-je ajouter de nouveaux, avec
addAll
.Pas besoin d'avoir de la Session et le manipuler.
De l'essayer. Ci-dessous fonctionné pour moi!
Dans le
hbm.xml
fichierNous devons définir la
dynamic-update
attribut de classe de la balise àtrue
:Définir l'attribut class de la balise generator en vertu de l'unique colonne de
identity
:Remarque: Ensemble de la colonne unique à
identity
plutôt queassigned
.Ce problème se produit lorsque nous mettons à jour l'objet même de la session, que nous avons utilisé pour aller chercher l'objet à partir de la base de données.
Vous pouvez utiliser la méthode de fusion de veille prolongée au lieu de la méthode de mise à jour.
par exemple, la Première session d'utilisation.get() et puis vous pouvez utiliser de la session.de fusion (de l'objet). Cette méthode ne créera pas de problème. On peut aussi utiliser la méthode merge() pour mettre à jour l'objet dans la base de données.
Une autre chose qui a fonctionné pour moi était de faire de la variable d'instance, depuis Longtemps, de longue
J'ai eu ma clé primaire de la variable à long id;
évolution à Long id; a travaillé
Tous les meilleurs
Vous pouvez toujours faire une session de chasse.
La chasse d'eau de synchroniser l'état de tous vos objets dans la session (s'il vous plaît, quelqu'un me corrige si je me trompe), et peut-être que cela permettrait de résoudre votre problème dans certains cas.
La mise en œuvre de votre propre equals et hashcode peut vous aider aussi.
Vous pouvez vérifier votre Cascade de Paramètres. La Cascade de paramètres sur vos modèles, pourrait en être la cause. J'ai enlevé Cascade de Paramètres (Essentiellement en ne permettant pas à la Cascade Insertions/Mises à jour) et cela a résolu mon problème
J'ai trouvé cette erreur ainsi. Ce qui a fonctionné pour moi est de faire en sorte que la clé primaire (qui est auto-générée) n'est pas un PDT (c'est à dire de long, int, ect.), mais un objet (c'est à dire de Long, Entier, etc)
Lorsque vous créez votre objet à enregistrer, assurez-vous de passer la valeur null et non pas 0.
Cela vous aide?
J'ai résolu un problème similaire comme ça:
Une solution de contournement pour résoudre ce problème est d'essayer de lire l'objet de retour de mise en veille prolongée cache/db avant de faire des mises à jour et persistent.
Exemple:
Remarque: Gardez à l'esprit que cela ne résout pas la cause, mais résout le problème.
La fin de la partie, mais il peut aider pour les prochains utilisateurs -
J'ai eu ce problème quand j' sélectionnez un enregistrement à l'aide
getsession()
et encore mise à jour un autre enregistrement avec le même identificateur à l'aide de même session à l'origine du problème. Ajouté le code ci-dessous.Cela ne devrait jamais être fait . La Solution est soit expulser session avant de mettre à jour ou changer de logique métier.
C'est parce que vous avez ouvert une session, peut-être pour obtenir les données, puis vous oubliez de fermer.
Lorsque vous supprimez vous ouvrir de session à nouveau, puis il devient erreur.
SOLUTION:
chaque fonction devrait s'ouvrir et de fermer la session
session.getTransaction.begin();
/* your operation */
session.close()
Dans mon modèle d'objet de classe i ha défini les annotations comme ce
le problème s'est résolu quand j'ai écrit les deux @Id et @GenerateValue annotation de concert @ la déclaration de la variable.
Espère que cela est utile
Dans ma course, je suit
1 - Commutateur de Paresseux clés dans l'entité
2 - télécharger la version la plus à jour à partir de Maven
--http://mvnrepository.com/artifact/org.javassist/javassist/3.19.0-GA