Hibernate kan kaste en ConstraintViolationException
når du forsøger at indsætte en række, der bryder en begrænsning (inklusive en unik begrænsning). Hvis du ikke får den undtagelse, kan du få en anden generel Hibernate-undtagelse - det afhænger af versionen af Hibernate og Hibernates evne til at kortlægge MySQL-undtagelsen til en Hibernate-undtagelse i den version og type database, du bruger ( Jeg har ikke testet det på alt).
Du får kun undtagelsen efter at have kaldt flush()
, så du bør sikre dig, at dette også er i din try-catch-blok.
Jeg ville være forsigtig med at implementere løsninger, hvor du tjekker, at rækken eksisterer først. Hvis flere sessioner opdaterer tabellen samtidigt, kan du få en løbstilstand. To processer læser rækken næsten på samme tid for at se, om den eksisterer; de opdager begge, at den ikke er der, og så forsøger de begge at oprette en ny række. Man vil fejle afhængigt af, hvem der vinder løbet.
En bedre løsning er at forsøge at indsætte først, og hvis det mislykkes, antag, at det allerede var der. Men når først du har en undtagelse, bliver du nødt til at rulle tilbage, så det vil begrænse, hvordan du kan bruge denne tilgang.