Hibernate może zgłosić ConstraintViolationException
podczas próby wstawienia wiersza, który łamie ograniczenie (w tym ograniczenie unikatowe). Jeśli nie otrzymasz tego wyjątku, możesz otrzymać inny ogólny wyjątek Hibernate - zależy to od wersji Hibernate i zdolności Hibernate do mapowania wyjątku MySQL na wyjątek Hibernate w używanej wersji i typie bazy danych ( Nie testowałem tego na wszystkim).
Wyjątek otrzymasz dopiero po wywołaniu flush()
, więc upewnij się, że jest to również w Twoim bloku try-catch.
Byłbym ostrożny przy wdrażaniu rozwiązań, w których najpierw sprawdzasz, czy wiersz istnieje. Jeśli wiele sesji aktualizuje tabelę jednocześnie, możesz uzyskać warunki wyścigu. Dwa procesy odczytują wiersz niemal w tym samym czasie, aby sprawdzić, czy istnieje; oboje wykrywają, że go tam nie ma, a następnie oboje próbują utworzyć nowy wiersz. Jeden zawiedzie w zależności od tego, kto wygra wyścig.
Lepszym rozwiązaniem jest najpierw spróbować wkładki, a jeśli się nie powiedzie, załóżmy, że już tam była. Jednak po pojawieniu się wyjątku będziesz musiał wycofać się, co ograniczy sposób korzystania z tego podejścia.