Руководство по JPA с весны

Руководство по JPA с весны

1. обзор

В этом руководствеshows how to set up Spring with JPA используется Hibernate в качестве поставщика сохраняемости.

Пошаговое введение в настройку контекста Spring с использованием конфигурации на основе Java и базового Maven pom для проекта см. Вthis article.

Мы начнем с настройки JPA в проекте Spring Boot, а затем рассмотрим полную конфигурацию, которая нам понадобится, если у нас есть стандартный проект Spring.

Дальнейшее чтение:

Определение объектов JPA

Узнайте, как определять сущности и настраивать их с помощью API персистентности Java.

Read more

Spring Boot с Hibernate

Краткое практическое введение в интеграцию Spring Boot и Hibernate / JPA.

Read more

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.