Ho un programma JPA in cui EclipseLink è il provider di Persistenza. Quando unisco un'entità utente, ne cambio l'ID e provo a unire nuovamente la stessa istanza utente, viene generato un errore. Riscrivo il mio codice per illustrare il mio problema nel modo più semplice.Unisci un'entità, modifica il relativo ID, unisci di nuovo, causa "mappato a una colonna chiave primaria nel database. Aggiornamenti non consentiti" Errore
User user = userManager.find(1);
userManager.merge(user);
System.out.println("User is managed? "+userManager.contains(user);
user.setId(2);
userManager.merge(user);
Il codice sopra riportato non è in un contesto di transazione. userManager è un bean di sessione stateless con un EntityManager iniettato. Quando viene eseguita, la console stampa:
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'eccezione si verifica al secondo richiamo di merge().
Se creo un nuovo utente, imposta il suo ID e si fondono, funziona:
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);
Allora, qual è la differenza tra il primo scenario e la seconda? Secondo la specifica JPA, finché l'entità è in stato di distacco, l'unione dovrebbe avere successo, giusto? (Supponendo che l'entità con ID = 2 esista)
Perché il provider EclipseLink sembra essere infastidito dal fatto che l'entità utente è stata unita prima?
Aggiornamento: Sembra un bug di EclipseLink. Ho sostituito il provider di persistenza da EclipseLink a Ibernazione:
posso cambiare
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
a
<provider>org.hibernate.ejb.HibernatePersistence</provider>
Nessun errore è stato gettato.
solamente dell'ID di un valore generato? – kostja
Sì, è un valore generato –