Я просматривал аннотацию @Repository, и было упомянуто, что она используется для перевода исключения, чтобы исключение Hibernate Exception в Spring DataAccessException. Также нам нужно настроить следующий постпроцессор
<bean class = "org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
Итак, у меня вопрос: зачем нужен этот перевод исключения. Разве мы не можем напрямую обработать собственное исключение?
Спасибо,




Думаю, это сделано для четкого разделения ответственности.
Вкратце, DAO - это уровень, который инкапсулирует всю работу с базой данных, а уровень обслуживания - это место для размещения вашей бизнес-логики.
Если это так, знания о Hibernate или любом другом инструменте, связанном с базой данных, должны оставаться внутри DAO, а служба не должна ничего знать об этом. Если вы, например, решите переключиться с Hibernate на, скажем, Jooq, или, в более общем смысле, решите изменить реляционную базу данных на что-то другое, возможно, на NoSQL, уровень обслуживания останется прежним, и изменится только реализация DAO.
Эта гибкость - отличная вещь, однако исключения, когда они выбрасываются из DAO и достигают уровня службы, могут нарушить этот дизайн, потому что, если служба должна перехватывать особые исключения Hibernate, по сути, связана с Hibernate.
Итак, Spring "предлагает" выбросить более общее исключение DataAccessException.
Надеюсь, что это ответ на ваш вопрос
Спасибо, Марк, теперь я довольно ясно понимаю использование аннотации репозитория.
Это не обязательно. Но приятно иметь возможность обрабатывать исключения одинаково, независимо от того, использует ли ваш уровень доступа к данным Hibernate, EclipseLink, JDBC или любой другой API-интерфейс сохранения.