Я не думаю, что есть нормальный стандартный способ сделать это - я думаю, это зависит от ваших потребностей. Могу рассказать вам свою точку зрения: Для меня валидация данных должна выполняться по сеттерам - то есть - как можно скорее. Таким образом, у вас не может быть сущности с недопустимым набором данных, и это спасет вас от головных болей, когда вы собираетесь продолжать.
Попробуйте подумать об этом так: предположим, у вас есть автомобиль, который работает на бензине. Вы отправляетесь на заправочную станцию, чтобы пополнить ее. У вас есть два насоса: бензин и бензин. Без проверки вы могли бы поставить там любой тип топлива, и пока вы не включите двигатель, ничего не произойдет. Но когда вы это сделаете, если вы поместите неправильный тип топлива, было бы слишком поздно. Boooooooom! Разумеется, объекты не взрываются.)
Сказав это, иногда невозможно выполнить проверку на одном сеттере, поскольку он может зависеть от другого свойства (которое еще не установлено). Что-то вроде VATID для пользовательского объекта, в котором должно быть доступно свойство user_type (private | company), чтобы иметь возможность проверять и форсировать VATID для компаний. В этом случае вы бы сделали PrePersist/PreUpdate validation.