К сожалению, в JPA нет способа избежать отката транзакции при нарушении уникального ограничения, поскольку спецификация требует, чтобы это исключение пометило транзакцию для отката. Кроме того, поскольку строка может не существовать, когда вы выполняете вызов 'lock' с помощью API JPA 2.0, вызов 'lock' не гарантирует, что только поток блокировки может вставить объект. «Блокировка» будет препятствовать обновлению сущности, но не вставке.
Вам необходимо выполнить «постоянство», как в вашем коде, но держать его как можно ближе к началу транзакции, или операция должна выполняться в собственной транзакции.
Если «persist» должен быть частью более крупной транзакции, а сбой «persist» не препятствует успешному выполнению этой части вашего приложения, вам следует сохранить экземпляры Entity из этой транзакции, и вы сможете их «объединить» в любую последующую транзакцию, когда ваше приложение восстанавливается после отката.