Sto usando Spring Data JPA con Hibernate e sto avendo problemi con la proprietà updatable = false sull'annotazione @Column
.Hibernate aggiornabile = falso Il campo UUID è aggiornato
Ho una classe di base per tutti i miei @Entity
oggetti con un UUID definita in questo modo:
@MappedSuperclass
@Getter @Setter @EqualsAndHashCode(of= {"uuid"})
public abstract class AbstractEntity implements Persistable<Long> {
@Id
@GeneratedValue(strategy = AUTO)
@Column(unique = true, updatable = false)
private Long id;
@Column(unique = true, updatable = false)
private UUID uuid = UUID.randomUUID();
}
Annotare la updatable = false
annotazione.
Per verificare il campo UUID in realtà non è aggiornabile, ho scritto questo test:
@Test
public void testChangeUUID() {
User user = userRepo.findOne(1L);
assertNotNull(user);
assertEquals(USER_UUID, user.getUuid().toString());
final UUID newUuid = UUID.randomUUID();
user.setUuid(newUuid);
user = userRepo.save(user);
assertEquals(newUuid, user.getUuid());
User user2 = userRepo.findOne(1L);
assertNotNull(user2);
assertEquals("UUID should not have changed", USER_UUID, user2.getUuid().toString());
}
mi è stato effettivamente aspettavo un'eccezione per essere gettato sulla chiamata alla userRepo.save(user)
, ma che ciò non accada. Invece, l'ultimo assertEquals()
fallisce, il che significa che l'UUID si stava effettivamente aggiornando.
È questo comportamento previsto? C'è un modo per impedire la modifica degli UUID?
Non è l'aggiornamento, il test è viziata. Non ci saranno eccezioni, il campo verrà ignorato silenziosamente quando si salva/aggiorna l'oggetto. Nulla è cambiato nel database. Il problema con il tuo test è che tutto accade in una singola transazione e quindi un'unica cache di primo livello (cioè "EntityManager"). L'oggetto 'user' e' user2' sono lo stesso oggetto ('user == user2' dovrebbe restituire' true'). La tua ultima asserzione è falsa quando hai cambiato la rappresentazione in memoria dell'oggetto 'User'. Non quello del database. Si desidera utilizzare una query semplice per verificarlo. –