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, поэтому его легко импортировать и запускать как есть.