Mysql
 sql >> Database >  >> RDS >> Mysql

Ibernazione + SU logica CHIAVE DUPLICATA

Hibernate può generare una ConstraintViolationException quando si tenta di inserire una riga che interrompe un vincolo (incluso un vincolo univoco). Se non ottieni quell'eccezione, potresti ottenere qualche altra eccezione generale di Hibernate:dipende dalla versione di Hibernate e dalla capacità di Hibernate di mappare l'eccezione MySQL su un'eccezione Hibernate nella versione e nel tipo di database che stai utilizzando ( Non l'ho testato su tutto).

Otterrai l'eccezione solo dopo aver chiamato flush() , quindi dovresti assicurarti che questo sia anche nel tuo blocco try-catch.

Farei attenzione a implementare soluzioni in cui controlli prima che la riga esista. Se più sessioni stanno aggiornando la tabella contemporaneamente, potresti ottenere una race condition. Due processi leggono la riga quasi contemporaneamente per vedere se esiste; entrambi rilevano che non è presente, quindi entrambi cercano di creare una nuova riga. Uno fallirà a seconda di chi vince la gara.

Una soluzione migliore è tentare prima l'inserimento e, se fallisce, presumere che fosse già presente. Tuttavia, una volta che hai un'eccezione, dovrai eseguire il rollback, in modo da limitare il modo in cui puoi utilizzare questo approccio.