Статьи

Уровень сохраняемости с Spring 3.1 и JPA

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
@EnableTransactionManagement
public class PersistenceJPAConfig{
 
   @Bean
   public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {
      LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
      em.setDataSource(dataSource());
      em.setPackagesToScan(new String[] { "org.baeldung.persistence.model" });
 
      JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
      em.setJpaVendorAdapter(vendorAdapter);
      em.setJpaProperties(additionalProperties());
 
      return em;
   }
 
   @Bean
   public DataSource dataSource(){
      DriverManagerDataSource dataSource = new DriverManagerDataSource();
      dataSource.setDriverClassName("com.mysql.jdbc.Driver");
      dataSource.setUrl("jdbc:mysql://localhost:3306/spring_jpa");
      dataSource.setUsername( "tutorialuser" );
      dataSource.setPassword( "tutorialmy5ql" );
      return dataSource;
   }
 
   @Bean
   public PlatformTransactionManager transactionManager(){
      JpaTransactionManager transactionManager = new JpaTransactionManager();
      transactionManager.setEntityManagerFactory(
       entityManagerFactoryBean().getObject() );
 
      return transactionManager;
   }
 
   @Bean
   public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){
      return new PersistenceExceptionTranslationPostProcessor();
   }
 
   Properties additionalProperties() {
      return new Properties() {
         // 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
<?xml version="1.0" encoding="UTF-8"?>
   xsi:schemaLocation="
 
   <bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
      <property name="dataSource" ref="dataSource" />
      <property name="packagesToScan" value="org.baeldung.persistence.model" />
      <property name="jpaVendorAdapter">
         <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
      </property>
      <property name="jpaProperties">
         <props>
            <prop key="hibernate.hbm2ddl.auto">create-drop</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
         </props>
      </property>
   </bean>
 
   <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="com.mysql.jdbc.Driver" />
      <property name="url" value="jdbc:mysql://localhost:3306/spring_jpa" />
      <property name="username" value="tutorialuser" />
      <property name="password" value="tutorialmy5ql" />
   </bean>
 
   <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
      <property name="entityManagerFactory" ref="myEmf" />
   </bean>
   <tx:annotation-driven />
 
   <bean id="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, поэтому его легко импортировать и запускать как есть.

Ссылка: Spring 3 и JPA с Hibernate от нашего партнера JCG Евгения Параскива в блоге baeldung .