В принципе, Spring Framework и другие связанные с Spring проекты (такие как Spring Data NoSQL) определяют сложную иерархию персистентности, наследующую от org.springframework .dao.DataAccessException. Эта иерархия заботится обо всем исключении, которое выбрасывается JDBC, Hibernate, другими реализациями ORM и JPA и т. Д.
В вашем веб-приложении вам нужно сделать две вещи, чтобы добиться перевода исключений.
Во-первых, настройте org.springframework.dao.support .PersistenceExceptionTranslator реализацию в ваших конфигурационных файлах. Вы можете сделать это путем определения боб LocalContainerEntityManagerFactoryBean в корневом классе конфигурации, как это:
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean()
{
Map<String, Object> properties = new Hashtable<>();
properties.put("javax.persistence.schema-generation.database.action",
"none");
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setDatabasePlatform("org.hibernate.dialect.MySQL5InnoDBDialect"); //you will chose a dialect that you are using for your project.
LocalContainerEntityManagerFactoryBean factory =
new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(adapter);
factory.setDataSource(this.springJpaDataSource());
factory.setPackagesToScan("packagenames"); //the packages that contains you @Repositories annotations
factory.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
factory.setValidationMode(ValidationMode.NONE);
factory.setJpaPropertyMap(properties);
return factory;
}
Этот класс реализует LocalContainerEntityManagerFactoryBeanPersistenceExceptionTranslator. Итак, вы позаботились о первом шаге.
Второй шаг - пометить ваши репозитории/сущности аннотацией @Repository
. Это говорит Spring, что аннотированный компонент имеет право на трансляцию исключений, используя сконфигурированный PersistenceExceptionTranslators
. Если методы репозитория выкидывают любые ошибки , то PersistenceExceptionTranslators
переводит эти исключения, если это необходимо.
Вы попробовали? Это ответит на вопрос. – zapl