Hibernate může vyvolat ConstraintViolationException
když se pokusíte vložit řádek, který porušuje omezení (včetně jedinečného omezení). Pokud tuto výjimku nezískáte, můžete získat nějakou jinou obecnou výjimku Hibernate – záleží na verzi Hibernate a schopnosti Hibernate mapovat výjimku MySQL na výjimku Hibernate ve verzi a typu databáze, kterou používáte ( Netestoval jsem to na všem).
Výjimku získáte až po zavolání flush()
, takže byste se měli ujistit, že je to také ve vašem bloku try-catch.
Byl bych opatrný při implementaci řešení, kde nejprve zkontrolujete, že řádek existuje. Pokud tabulku aktualizuje více relací současně, můžete získat podmínku závodu. Dva procesy čtou řádek téměř ve stejnou dobu, aby zjistily, zda existuje; oba zjistí, že tam není, a pak se oba pokusí vytvořit nový řádek. Jeden selže v závislosti na tom, kdo vyhraje závod.
Lepším řešením je nejprve zkusit vložku a pokud selže, předpokládejme, že tam již byla. Jakmile však budete mít výjimku, budete se muset vrátit zpět, takže to omezí způsob použití tohoto přístupu.