ситуация:
Допустим мы хотим обновить машину, у машины есть колеса и фары...
Мы хотим заменить колёса и фары, указываем новые id колес и фар.
Во время обновления сущности (или перед обновлением) необходимо делать валидацию связынных сущностей (фар и колес, может таковых нет уже в БД).
У меня сейчас в проекте есть кастомный валидатор, в котором как раз и проверяются и фары и колёса.
Этот валидатор запускается первой строчкой в сервисе в методе updateCar (но можно его сделать конечно и через AOP, не суть)
в валидаторе метод:
void checkКолесо(Long Id) { repository.findById(1L).orElseThrow () -> new КастомнаяОшибка} (или existsById(1L) )
то есть при таком подходе у нас сервис даже не запустится, если сущность не будет найдена, так-как все проверки будут в валидаторе.
Но дело в том что после успешного прохождения проверок в валидаторе, начинается выполнятся сервис, а там в конвертере (маппере) идут setЫ сущностей, то есть опять repository.findById(1L).orElseThrow() (только уже без кастомной ошибки, т.к. оно отлавливается в валидаторе и сущность уже хранится в кеше хибернейта).
Норм вообще такой подход?)
Варианты:
1) оставить так как есть.
2) убрать поиск сущностей в валидаторе, этого достаточно в конвертерах, пусть ошибка если не нашли падает там, ничего страшного что побежит логика сервиса и где нить потом упадет, мы ведь используем транзакцию
3) оставить проверки сущностей в валидаторе, не делать проверки в конвертерах, просто в конвертерах можно использовать вариант setWheel(new Well.setId(...))
Старался более подробно и понятно описать ситуацию, хочется узнать, как правильней лучше, какой подход чаще используется)
а можно убрать лези лоадинг чтобы впринципе в конверторах ничо не вызывалось?) Третий вариант самый адекватный
нет смысла валидировать корректность внешних ключей на этапе преобразования или в сервисах, проверки внешних ключей выполняются на этапе коммита транзакции(даже не на этапе flush'а) собирай сущность как есть и пытайся коммитить транзакцию, если не сработало - обрабатывай ошибку уже вне транзакции вот тут есть речь об этом https://youtu.be/YzOTZTt-PR0?t=2351
Обсуждают сегодня