Рубрики
Без рубрики

Руководство по JPA с пружиной

Настройка JPA с помощью Spring – как настроить EntityManagerFactory и использовать необработанные API JPA.

Автор оригинала: Eugen Paraschiv.

1. Обзор

В этом руководстве показано , как настроить Spring с помощью JPA , используя Hibernate в качестве поставщика персистентности.

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

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

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

Определение сущностей JPA

Весенняя загрузка с гибернацией

Вот видео о настройке Hibernate 4 с Spring 4 (я рекомендую посмотреть его в полном разрешении 1080p):

2. JPA в весеннем ботинке

Проект 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.2.6.RELEASE


    org.springframework.boot
    spring-boot-starter-data-jpa
    2.2.6.RELEASE

spring-boot-starter содержит необходимую автоматическую конфигурацию для Spring JPA. Кроме того, проект spring-boot-starter-jpa ссылается на все необходимые зависимости, такие как hibernate-core .

2.2. Конфигурация

Spring Boot настраивает Hibernate в качестве поставщика JPA по умолчанию , поэтому больше нет необходимости определять компонент EntityManagerFactory , если мы не хотим его настроить.

Spring Boot также может автоматически настроить источник данных bean в зависимости от базы данных, которую мы используем . В случае базы данных в памяти типа H2 , HSQLDB, и Apache Derby загрузка автоматически настраивает Источник данных , если соответствующая зависимость базы данных присутствует в пути к классу.

Например, если мы хотим использовать базу данных в памяти H2 в JPA-приложении Spring Boot, нам нужно только добавить зависимость h2 в pom.xml файл:


    com.h2database
    h2
    1.4.200

Таким образом, нам не нужно определять источник данных bean, но мы можем сделать это, если хотим его настроить.

Если мы хотим использовать JPA с базой данных MySQL , то нам нужна зависимость mysql-connector-java , а также для определения конфигурации источника данных|/.

Мы можем сделать это в классе @Configuration или с помощью стандартных свойств загрузки Spring.

Конфигурация 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.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 он был изменен на ХикариКП .

Вы можете найти больше примеров настройки JPA в Spring Boot в проекте GitHub .

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

Однако если у нас есть стандартный проект Spring, нам нужна более явная конфигурация с использованием Java или XML. Именно на этом мы сосредоточимся в следующих разделах.

3. Конфигурация JPA Spring С Java – в Проекте Без загрузки

Чтобы использовать JPA в весеннем проекте, нам нужно настроить EntityManager.

Это основная часть конфигурации, и мы можем сделать это с помощью пружинного завода. Это может быть либо более простой LocalEntityManagerFactoryBean , либо более гибкий LocalContainerEntityManagerFactoryBean .

Давайте посмотрим, как мы можем использовать последний вариант:

@Configuration
@EnableTransactionManagement
public class PersistenceJPAConfig{

   @Bean
   public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
      LocalContainerEntityManagerFactoryBean em 
        = new LocalContainerEntityManagerFactoryBean();
      em.setDataSource(dataSource());
      em.setPackagesToScan(new String[] { "com.baeldung.persistence.model" });

      JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
      em.setJpaVendorAdapter(vendorAdapter);
      em.setJpaProperties(additionalProperties());

      return em;
   }
   
   // ...

}

Нам также необходимо явно определить источник данных 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 и Диспетчер транзакций и exceptionTranslation beans:

@Bean
public PlatformTransactionManager transactionManager() {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());

    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 С XML

Далее, давайте рассмотрим ту же конфигурацию Spring с XML:


    
    
    
        
    
    
        
            create-drop
            org.hibernate.dialect.MySQL5Dialect
        
    



    
    
    
    



    



Существует относительно небольшая разница между XML и новой конфигурацией на основе Java. А именно, в XML ссылка на другой компонент может указывать либо на компонент, либо на фабрику компонентов для этого компонента.

Однако в Java, поскольку типы различны, компилятор не разрешает этого, и поэтому EntityManagerFactory сначала извлекается из своей фабрики компонентов, а затем передается менеджеру транзакций:

transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());

5. Переход на полный XML-без

Обычно JPA определяет единицу сохранения через META-INF/persistence.xml файл. Начиная с весны 3.1, persistence.xml больше не нужно . LocalContainerEntityManagerFactoryBean теперь поддерживает свойство packagesToScan , в котором можно указать пакеты для сканирования классов @Entity .

Этот файл был последним фрагментом XML, который нам нужно удалить. Теперь мы можем полностью настроить JPA без XML.

Обычно мы указываем свойства JPA в persistence.xml файл. В качестве альтернативы мы можем добавить свойства непосредственно в компонент entitymanagerfactory:

factoryBean.setJpaProperties(this.additionalProperties());

В качестве примечания, если Hibernate будет поставщиком персистентности, то это также будет способом указать конкретные свойства Hibernate.

6. Конфигурация Maven

В дополнение к зависимостям Spring Core и persistence – подробно показано в учебнике Spring with Maven – нам также необходимо определить JPA и Hibernate в проекте, а также соединитель MySQL:


   org.hibernate
   hibernate-core
   5.2.17.Final
   runtime



   mysql
   mysql-connector-java
   8.0.19
   runtime

Обратите внимание, что зависимость MySQL включена здесь в качестве примера. Нам нужен драйвер для настройки источника данных, но любая база данных, поддерживаемая гибернацией, подойдет .

7. Заключение

В этом руководстве показано, как настроить JPA с помощью Hibernate в Spring как в Spring Boot, так и в стандартном приложении Spring.

Как всегда, код, представленный в этой статье, доступен на GitHub .