La mia entità ha sia la chiave primaria (id) autogenerata che la chiave aziendale (spazio dei nomi). Devo aggiornare il record sostituendo quello vecchio. Quindi, lo sto cercando per chiave aziendale, cancellarlo e salvare una nuova entità. Funziona se ogni operazione nella propria transazione. Ma una volta che li ho messi tutti nella stessa transazione, quando viene eseguito il salvataggio di save(), delete() non è stato ancora eseguito, quindi ottengo una violazione del vincolo.Spring JpaRepository: delete() con successivo save() nella stessa transazione
transactionTemplate.execute(status -> {
MyEntity oldEntity = repository.findByNamespace(namespace);
if (oldEntity != null) {
repository.delete(oldEntity);
}
repository.save(newEntity);
return null;
});
ho effettivamente riuscito a bypassare con l'aggiunta di
repository.flush();
Ma io davvero non capisco il motivo per cui ho bisogno di questa flush().
Penso che sia perché il provider JPA si sente libero di riorganizzare e/o ottimizzare le scritture di database delle modifiche in sospeso dal contesto persistente, in particolare il provider JPA non si sente obbligato a eseguire le scritture del database nell'ordinazione e nel modulo implicato dai cambiamenti individuali del contesto persistente. Ad ogni modo, la situazione descritta è nota e il metodo flush() è noto. – Michal