L'EntityManager: merge() est d'essayer de créer une nouvelle ligne dans la base de données - pourquoi?
Je suis en utilisant JPA par la Cadre de.
Je vérifie pour voir si un Utilisateur objet est mis en cache, et si oui, je les récupérer et de les fusionner() pour que je puisse mettre à jour les champs et enregistrer les modifications plus tard:
user = (User) Cache.get("user-auth-" + sessionAuthToken);
if (user != null) {
user = user.merge(); //I believe this is the same as EntityManager.merge()
}
Cependant lorsque je fais ceci, j'obtiens l'erreur suivante:
PersistenceException occured :
org.hibernate.exception.ConstraintViolationException:
could not insert: [models.User]
...
Caused by: com.mysql.jdbc.exceptions.jdbc4.
MySQLIntegrityConstraintViolationException:
Duplicate entry '1235411688335416533' for key 'authToken'
Il semble que sa tentative d'insertion d'un nouvel utilisateur, même si cet utilisateur doit être, et est déjà dans la base de données. Pourquoi serait-merge ()?
Ou peut-être que je vais sur ce entièrement le mauvais sens - conseils seraient appréciés.
Est
Pas de clé primaire, mais il y a une contrainte d'unicité
la prochaine fois que vous avez un problème Hibernate, peut-être que vous devriez mentionner ce fait. JPA est une interface, votre problème est avec Hibernate mise en œuvre. Un peu de détails quant à la définition de l'entité ne ferait pas de mal, que ce soit -- voir ma réponse ci-dessous, qui identifie probablement la cause de votre problème.
authToken
une clé primaire?Pas de clé primaire, mais il y a une contrainte d'unicité
la prochaine fois que vous avez un problème Hibernate, peut-être que vous devriez mentionner ce fait. JPA est une interface, votre problème est avec Hibernate mise en œuvre. Un peu de détails quant à la définition de l'entité ne ferait pas de mal, que ce soit -- voir ma réponse ci-dessous, qui identifie probablement la cause de votre problème.
OriginalL'auteur sanity | 2011-02-03
Vous devez vous connecter pour publier un commentaire.
Je crois que votre problème est la façon de Jouer gère la JPA de l'environnement (et les transactions).
Une fois que vous recevez une demande, le cadre qui crée immédiatement l'APP manager et une opération. À partir de ce moment tous vos entités du Modèle sont automatiquement liés à la manager.
Jouer facilite le travail avec ce modèle en 2 façons:
Par l'exécution de "fusionner" vous essayez d'ajouter à la Manager d'une entité qui est déjà là, ce qui provoque la clé unique exception. Si vous il suffit de charger l'entité à partir du cache, vous serez en mesure de modifier et d'appeler la méthode save() une fois cela fait, et il va fonctionner.
OriginalL'auteur Pere Villega
Je pense que c'est peut être un poblem avec
hashCode()
etequals()
. Si il n'y a pas mis en œuvre correctement, une nouvelle entité mon être insérée à la place de updateing un existant.Cela signifie, que vous ne pouvez pas les comparer ou de les stocker deux unsafed les entités au sein d'un ensemble, parce qu'ils seraient
euqal
à moins que vous générez unUUID
dans le constructeur de l'objet. (Mais cela ne conduit pas à votre problème)OriginalL'auteur Christian Kuetbach
Voir Quelle est la bonne façon de ré-attacher des objets détachés en veille prolongée?. Fusion essaie d'écrire le obsolètes état de la db pour remplacer d'autres mises à jour simultanées. La question liée mentionne
session.lock(entity, LockMode.NONE);
comme une solution possible, je n'ai pas essayé.OriginalL'auteur Alexander Torstling
Si
authToken
n'est pas une clé primaire, puis peut-être la clé primaire de laUser
instance d'être fusionnées ne correspond pas à la clé primaire de son homologue dans la base de données, doncmerge()
pense que c'est une nouvelleUser
et tente de l'insérer.Vérifiez que la clé primaire de la
User
, peut-être qu'il ait été endommagé ou perdu en quelque sorte.OriginalL'auteur axtavt
C'est un définition de l'entité problème; en ce qui concerne spécifiquement clé primaire/non enregistrées valeurs.
La définition de l'entité doit être correcte, à Hibernate de le reconnaître comme "déjà sauvé". Par exemple, 'null', dans un nullable champ version peut causer Hibernate faire abstraction de toute ID & considérer comme non enregistrées.
C'est une Hibernate question, pas seulement de la JPA. JPA est l'interface -- vous rencontrez des problèmes avec une mise en œuvre spécifique.
OriginalL'auteur Thomas W