Проверка перед удалением менее эффективна и может привести к нарушению ограничения, если какая-либо ссылка добавляется другой транзакцией между моментом проверки и моментом удаления.
С другой стороны, он позволяет отображать более конкретное сообщение об ошибке пользователю (например, «на группу все еще ссылается FooBar»).
Просто делай то, что тебе кажется лучшим в твоем конкретном случае. Однако обратите внимание, что в случае возникновения какого-либо исключения вся транзакция должна быть откатана, а сеанс должен быть закрыт, поскольку такое исключение оставляет сеанс в несогласованном состоянии. Более того, это не удаление, а сброс или фиксация, которая вызовет исключение.
Теперь, если вы хотите проверить, волшебного решения не существует. У вас могут быть двунаправленные ассоциации, и вы можете проверить, что group.getUsers()
является emtpy (хотя это приведет к получению всех пользователей группы). Или вы можете выполнить специальные запросы, такие как select count(user.id) from User user where user.group = :group
, чтобы узнать, есть ли ссылка на группу. Но вам нужно сделать один из них для каждой возможной ссылки на группу.