Fusion d'une entité, de changer son id, de fusionner de nouveau, cause “mappé à une colonne de clé primaire dans la base de données. Les mises à jour ne sont pas autorisés” erreur

J'ai un APC programme où EclipseLink est le fournisseur de Persistance. Quand je les fusionner en une entité utilisateur, modifier son ID et tenter de fusionner le même utilisateur instance de nouveau, une erreur est renvoyée. - Je réécrire mon code pour illustrer mon problème de la manière la plus simple.

User user = userManager.find(1);
userManager.merge(user);
System.out.println("User is managed? "+userManager.contains(user);
user.setId(2);
userManager.merge(user);

Le code ci-dessus n'est pas dans un contexte de transaction. userManager est un bean session sans état avec un EntityManager injecté. Lorsqu'il est exécuté, la console imprime:

User is managed? false

Exception [EclipseLink-7251] (Eclipse Persistence Services - 2.1.3.v20110304-r9073): org.eclipse.persistence.exceptions.ValidationException
Exception Description: The attribute [id] of class [demo.model.User] is mapped to a primary key column in the database. Updates are not allowed.

L'exception se produit lors de la deuxième fusion() invocation.

Si je crée un nouvel utilisateur, définit son ID et de fusion, il fonctionne:

User user = userManager.find(1);
userManager.merge(user);
System.out.println("User is managed? "+userManager.contains(user);
User newUser = new User();
newUser.setId(2);
userManager.merge(newUser);

Quelle est donc la différence entre le premier scénario et une seconde? Selon la spécification JPA, tant que l'entité est en état détaché, la fusion doit réussir, non?
(En supposant que l'entité avec l'ID=2)

Pourquoi le EclipseLink fournisseur semble être gêné par le fait que l'entité utilisateur a été fusionnées avant?

Mise à jour: Il semble être un bug de EclipseLink. J'ai remplacé le fournisseur de persistance de EclipseLink de mise en veille prolongée:

- Je changer

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

à

<provider>org.hibernate.ejb.HibernatePersistence</provider>    

Aucune erreur n'a été levée.

Est votre ID d'une valeur générée?
Oui, c'est une valeur générée

OriginalL'auteur Mingtao Sun | 2012-09-11