Hibernate может выдать ConstraintViolationException
при попытке вставить строку, которая нарушает ограничение (включая ограничение уникальности). Если вы не получите это исключение, вы можете получить другое общее исключение Hibernate - это зависит от версии Hibernate и способности Hibernate сопоставить исключение MySQL с исключением Hibernate в версии и типе базы данных, которую вы используете ( Я не проверял это на всем).
Исключение вы получите только после вызова flush()
, поэтому убедитесь, что оно также есть в вашем блоке try-catch.
Я бы позаботился о реализации решений, в которых вы проверяете, что строка существует первой. Если несколько сеансов обновляют таблицу одновременно, вы можете получить условие гонки. Два процесса читают строку в одно и то же время, чтобы узнать, существует ли она; они оба обнаруживают, что его там нет, и затем они оба пытаются создать новую строку. Один из них провалится в зависимости от того, кто выиграет гонку.
Лучшее решение состоит в том, чтобы сначала попытаться вставить и, если это не удастся, предположить, что она уже была там. Однако, как только у вас возникнет исключение, вам придется откатиться, что ограничит возможности использования этого подхода.