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 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