Tengo un programa JPA donde EclipseLink es el proveedor de Persistencia. Cuando fusiono una entidad de usuario, cambio su ID y trato de fusionar la misma instancia de usuario nuevamente, se produce un error. Reescribo mi código para ilustrar mi problema de la manera más simple.Fusionar una entidad, cambiar su ID, fusionar de nuevo, causar "asignada a una columna de clave principal en la base de datos. No se permiten actualizaciones" error
User user = userManager.find(1);
userManager.merge(user);
System.out.println("User is managed? "+userManager.contains(user);
user.setId(2);
userManager.merge(user);
El código anterior no está en el contexto de una transacción. userManager es un bean de sesión sin estado con un EntityManager inyectado. Cuando se ejecuta, la consola 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.
La excepción se produce en la segunda invocación merge().
Si creo un nuevo usuario, establece su ID y fusionarlo, funciona:
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);
Entonces, ¿cuál es la diferencia entre el primer y el segundo escenario de uno? De acuerdo con la especificación JPA, siempre que la entidad esté en estado separado, la fusión debería tener éxito, ¿no? (suponiendo que exista la entidad con ID = 2)
¿Por qué al proveedor de EclipseLink parece molestarle el hecho de que la entidad de usuario se haya fusionado anteriormente?
Actualización: Parece ser un error de EclipseLink. He sustituido el proveedor de persistencia de EclipseLink a Hibernate:
puedo cambiar
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
a
<provider>org.hibernate.ejb.HibernatePersistence</provider>
Sin error ha sido lanzado.
es tu ID un valor generado? – kostja
Sí, es un valor generado –