1. Обзор
Из этого туториала Вы узнаете, как настроить Spring с JPA , используя Hibernate в качестве поставщика сохраняемости.
Пошаговое введение по настройке контекста Spring с использованием конфигурации на основе Java и базового Maven pom для проекта см. В этой статье .
2. Конфигурация JPA Spring с Java
Чтобы использовать JPA в проекте Spring, необходимо настроить EntityManager .
Это основная часть конфигурации — и она выполняется с помощью фабричного компонента Spring — либо более простого LocalEntityManagerFactoryBean, либо более гибкого LocalContainerEntityManagerFactoryBean . Последний вариант используется здесь, так что для него можно настроить дополнительные свойства:
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | @Configuration@EnableTransactionManagementpublicclassPersistenceJPAConfig{   @Bean   publicLocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {      LocalContainerEntityManagerFactoryBean em = newLocalContainerEntityManagerFactoryBean();      em.setDataSource(dataSource());      em.setPackagesToScan(newString[] { "org.baeldung.persistence.model"});      JpaVendorAdapter vendorAdapter = newHibernateJpaVendorAdapter();      em.setJpaVendorAdapter(vendorAdapter);      em.setJpaProperties(additionalProperties());      returnem;   }   @Bean   publicDataSource dataSource(){      DriverManagerDataSource dataSource = newDriverManagerDataSource();      dataSource.setDriverClassName("com.mysql.jdbc.Driver");      dataSource.setUrl("jdbc:mysql://localhost:3306/spring_jpa");      dataSource.setUsername( "tutorialuser");      dataSource.setPassword( "tutorialmy5ql");      returndataSource;   }   @Bean   publicPlatformTransactionManager transactionManager(){      JpaTransactionManager transactionManager = newJpaTransactionManager();      transactionManager.setEntityManagerFactory(       entityManagerFactoryBean().getObject() );      returntransactionManager;   }   @Bean   publicPersistenceExceptionTranslationPostProcessor exceptionTranslation(){      returnnewPersistenceExceptionTranslationPostProcessor();   }   Properties additionalProperties() {      returnnewProperties() {         {  // Hibernate Specific:             setProperty("hibernate.hbm2ddl.auto", "create-drop");            setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");         }      };   }} | 
Также обратите внимание, что до Spring 3.2 cglib должен был находиться в пути к классам для работы классов Java @Configuration ; Чтобы лучше понять необходимость использования cglib в качестве зависимости, посмотрите это обсуждение об артефакте cglib в Spring .
3. Конфигурация JPA Spring с XML
Та же конфигурация Spring с XML:
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <?xmlversion="1.0"encoding="UTF-8"?>   xsi:schemaLocation="   <beanid="myEmf"class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">      <propertyname="dataSource"ref="dataSource"/>      <propertyname="packagesToScan"value="org.baeldung.persistence.model"/>      <propertyname="jpaVendorAdapter">         <beanclass="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>      </property>      <propertyname="jpaProperties">         <props>            <propkey="hibernate.hbm2ddl.auto">create-drop</prop>            <propkey="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>         </props>      </property>   </bean>   <beanid="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource">      <propertyname="driverClassName"value="com.mysql.jdbc.Driver"/>      <propertyname="url"value="jdbc:mysql://localhost:3306/spring_jpa"/>      <propertyname="username"value="tutorialuser"/>      <propertyname="password"value="tutorialmy5ql"/>   </bean>   <beanid="transactionManager"class="org.springframework.orm.jpa.JpaTransactionManager">      <propertyname="entityManagerFactory"ref="myEmf"/>   </bean>   <tx:annotation-driven/>   <beanid="persistenceExceptionTranslationPostProcessor"      class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/></beans> | 
Относительно небольшого различия между способом настройки Spring в XML и новой конфигурацией на основе Java — в XML ссылка на другой компонент может указывать либо на компонент, либо на фабрику компонентов для этого компонента. В Java, однако, поскольку типы различаются, компилятор не позволяет этого, и поэтому EntityManagerFactory сначала извлекается из его фабрики компонентов, а затем передается менеджеру транзакций:
txManager.setEntityManagerFactory ( this.entityManagerFactoryBean (). getObject () );
4. Переход на полный XML-менее
Обычно JPA определяет единицу постоянства через файл META-INF / persistence.xml . Начиная с Spring 3.1, файл persistence.xml больше не нужен — LocalContainerEntityManagerFactoryBean теперь поддерживает свойство packagesToScan, в котором можно указывать пакеты для сканирования на классы @Entity .
Этот файл был последним фрагментом XML, который будет удален — теперь JPA может быть полностью настроен без XML .
4.1. JPA Свойства
Свойства JPA обычно указываются в файле persistence.xml ; в качестве альтернативы, свойства могут быть указаны непосредственно для фабричного компонента управления объектами:
factoryBean.setJpaProperties (this.additionalProperties ());
В качестве дополнительного примечания: если Hibernate будет поставщиком сохраняемости, то это будет способ указать конкретные свойства Hibernate.
5. Конфигурация Maven
В дополнение к Spring Core и зависимостям персистентности — подробно показано в руководстве Spring с Maven — нам также необходимо определить JPA и Hibernate в проекте, а также коннектор MySQL. :
| 01 02 03 04 05 06 07 08 09 10 11 12 13 | <dependency>   <groupId>org.hibernate</groupId>   <artifactId>hibernate-entitymanager</artifactId>   <version>4.2.4.Final</version>   <scope>runtime</scope></dependency><dependency>   <groupId>mysql</groupId>   <artifactId>mysql-connector-java</artifactId>   <version>5.1.26</version>   <scope>runtime</scope></dependency> | 
Обратите внимание, что зависимость MySQL включена в качестве ссылки — для настройки источника данных необходим драйвер, но подойдет любая база данных, поддерживаемая Hibernate .
6. Заключение
В этом руководстве показано, как настроить JPA с помощью Hibernate in Spring с использованием конфигурации XML и Java.
Мы также обсудили, как избавиться от последнего фрагмента XML, обычно связанного с JPA, — persistence.xml . Конечный результат — легкая, чистая реализация DAO, практически не зависящая от времени компиляции с Spring.
Реализацию этого Spring JPA Tutorial можно найти в проекте github — это проект на основе Eclipse, поэтому его легко импортировать и запускать как есть.