Руководство по JPA с весны
1. обзор
В этом руководствеshows how to set up Spring with JPA используется Hibernate в качестве поставщика сохраняемости.
Пошаговое введение в настройку контекста Spring с использованием конфигурации на основе Java и базового Maven pom для проекта см. Вthis article.
Мы начнем с настройки JPA в проекте Spring Boot, а затем рассмотрим полную конфигурацию, которая нам понадобится, если у нас есть стандартный проект Spring.
Дальнейшее чтение:
Определение объектов JPA
Узнайте, как определять сущности и настраивать их с помощью API персистентности Java.
Spring Boot с Hibernate
Краткое практическое введение в интеграцию Spring Boot и Hibernate / JPA.
NEW: Вот видео о настройке Hibernate 4 с помощью Spring 4 (я рекомендую посмотреть его в полном разрешении 1080p):
[.iframe-fluid] ##
2. JPA в Spring Boot
Проект Spring Boot призван сделать создание приложений Spring намного быстрее и проще. Это делается с использованием стартеров и автоматической настройки для различных функций Spring, в том числе JPA.
2.1. Maven Зависимости
Чтобы включить JPA в приложении Spring Boot, нам нужны зависимостиspring-boot-starter иspring-boot-starter-data-jpa:
org.springframework.boot
spring-boot-starter
2.1.4.RELEASE
org.springframework.boot
spring-boot-starter-data-jpa
2.1.4.RELEASE
spring-boot-starter содержит необходимую автоконфигурацию для Spring JPA. Кроме того, проектspring-boot-starter-jpa ссылается на все необходимые зависимости, такие какhibernate-entitymanager.
2.2. конфигурация
Spring Boot configures Hibernate as the default JPA provider, поэтому больше нет необходимости определять bean-компонентentityManagerFactory, если мы не хотим его настраивать.
Spring Boot can also auto-configure the dataSource bean, depending on the database we’re using. В случае базы данных в памяти типаH2,HSQLDB иApache Derby, Boot автоматически настраиваетDataSource, если соответствующая зависимость базы данных присутствует в пути к классам.
Например, если мы хотим использовать базу данныхH2 в памяти в приложении Spring Boot JPA, нам нужно только добавить зависимостьh2 к файлуpom.xml:
com.h2database
h2
1.4.197
Таким образом, нам не нужно определять bean-компонентdataSource, но мы можем это сделать, если захотим его настроить.
Если мы хотим использовать JPA с базой данныхMySQL, тогда нам нужна зависимостьmysql-connector-java, а также определение конфигурацииDataSource.
Мы можем сделать это в классе@Configuration или с помощью стандартных свойств Spring Boot.
Конфигурация Java выглядит так же, как в стандартном проекте Spring:
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUsername("mysqluser");
dataSource.setPassword("mysqlpass");
dataSource.setUrl(
"jdbc:mysql://localhost:3306/myDb?createDatabaseIfNotExist=true");
return dataSource;
}
Чтобы настроить источник данных с помощью файла свойств, мы должны установить свойства с префиксомspring.datasource:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=mysqluser
spring.datasource.password=mysqlpass
spring.datasource.url=
jdbc:mysql://localhost:3306/myDb?createDatabaseIfNotExist=true
Spring Boot автоматически настроит источник данных на основе этих свойств.
Также в Spring Boot 1 пул соединений по умолчанию былTomcat, но в Spring Boot 2 он был изменен наHikariCP.
Вы можете найти больше примеров настройки JPA в Spring Boot вGitHub project.
Как мы видим, базовая конфигурация JPA довольно проста, если мы используем Spring Boot.
Однакоif we have a standard Spring project, then we need more explicit configuration, using either Java or XML. Это то, на чем мы сосредоточимся в следующих разделах.
3. Конфигурация JPA Spring с Java - в проекте без загрузки
Чтобы использовать JPA в проекте Spring,we need to set up the EntityManager.
Это основная часть конфигурации, и мы можем сделать это с помощью фабричного компонента Spring. Это может быть как более простойLocalEntityManagerFactoryBean, так иthe more flexible LocalContainerEntityManagerFactoryBean.
Давайте посмотрим, как мы можем использовать последний вариант:
@Configuration
@EnableTransactionManagement
public class PersistenceJPAConfig{
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean em
= new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan(new String[] { "com.example.persistence.model" });
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
em.setJpaProperties(additionalProperties());
return em;
}
// ...
}
We also need to explicitly define the DataSource bean мы использовали выше:
@Bean
public DataSource dataSource(){
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/spring_jpa");
dataSource.setUsername( "tutorialuser" );
dataSource.setPassword( "tutorialmy5ql" );
return dataSource;
}
Заключительная часть конфигурации - это дополнительные свойства Hibernate и bean-компонентыTransactionManager иexceptionTranslation:
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){
return new PersistenceExceptionTranslationPostProcessor();
}
Properties additionalProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.hbm2ddl.auto", "create-drop");
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
return properties;
}
4. Конфигурация JPA Spring с XML
Затем давайте посмотрим на ту же конфигурацию Spring с XML:
create-drop
org.hibernate.dialect.MySQL5Dialect
Существует сравнительно небольшая разница между XML и новой конфигурацией на основе Java. А именно, в XML ссылка на другой бин может указывать либо на бин, либо на фабрику бинов для этого бина.
Однако в Java, поскольку типы различны, компилятор не разрешает этого, поэтомуEntityManagerFactory сначала извлекается из его фабрики компонентов, а затем передается диспетчеру транзакций:
txManager.setEntityManagerFactory(this.entityManagerFactoryBean().getObject());
5. Переход на полное отсутствие XML
Обычно JPA определяет единицу сохранения состояния через файлMETA-INF/persistence.xml. Starting with Spring 3.1, the persistence.xml is no longer necessary. LocalContainerEntityManagerFactoryBean теперь поддерживает свойство‘packagesToScan', в котором можно указать пакеты для сканирования на предмет классов@Entity.
Этот файл был последним фрагментом XML, который мы должны удалить. We can now set up JPA fully with no XML.с
Обычно мы указываем свойства JPA в файлеpersistence.xml. В качестве альтернативы, мы можем добавить свойства непосредственно в bean-компонент фабрики менеджера сущностей:
factoryBean.setJpaProperties(this.additionalProperties());
Напомним, что если Hibernate будет поставщиком сохраняемости, то это будет способ указать специфические свойства Hibernate.
6. Конфигурация Maven
В дополнение к зависимостям Spring Core и сохраняемости - подробно показано вSpring with Maven tutorial - нам также необходимо определить JPA и Hibernate в проекте, а также соединитель MySQL:
org.hibernate
hibernate-entitymanager
5.4.2.Final
runtime
mysql
mysql-connector-java
6.0.6
runtime
Обратите внимание, что зависимость MySQL включена в качестве примера. Нам нужен драйвер для настройки источника данных, но подойдет любойHibernate supported database.
7. Заключение
В этом руководстве показано, как настроитьJPA with Hibernate in Spring как в Spring Boot, так и в стандартном приложении Spring.
Как всегда, доступен код, представленный в этой статьеover on Github.