2011-01-03 10 views
7

tutti. Ho problemi a sostituire le righe esistenti nella tabella con quelle nuove. Io uso JPA e DB PostgreSQL. Sto tentando di eliminare tutte le righe esistenti e quindi di crearne di nuove, ma di ricevere un'eccezione: org.postgresql.util.PSQLException: ERRORE: il valore della chiave duplicata viola il vincolo univoco "user_destination_pk". Tutte queste azioni sono all'interno di una singola transazione JTA. Sembra che JPA non cancelli le righe prima di inserirle, ma non ricevo alcuna eccezione di cancellazione ... Qualsiasi aiuto è apprezzato.Sostituire le righe esistenti con quelle nuove causa l'eccezione chiave duplicata

risposta

10

Utilizzare il metodo Hibernate Session.flush() per eliminare (eseguire l'SQL di) le eliminazioni prima di salvare/aggiungere le nuove entità.

+0

Grazie, ho pensato a flush(), ma credo che finisce transazioni DB. Ho ragione? Non voglio eliminare, non essendo sicuro che le nuove righe siano buone. – damluar

+0

chiamata flush() non completa la transazione (sebbene il commit della transazione sia implicitamente flush()), rende Hibernate solo esegui SQL per portare il db nello stesso stato della sessione. – araqnid

+0

grazie, ora è chiaro – damluar

0

È possibile creare il vincolo unico come deferrable initially deferred

+0

All'inizio ci ho pensato anch'io, ma non credo che sarebbe d'aiuto qui. Dalla descrizione sembra che in realtà è JPA che non invia le eliminazioni prima di inviare gli inserti. L'unica situazione in cui ciò sarebbe utile è quando JPA invierà le eliminazioni ** dopo ** l'invio degli inserti. –

+0

@a_horse_with_no_name Tuttavia non ha importanza all'interno della stessa transazione JTA. –

Problemi correlati