编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

Spring Data之Spring JPA初始化(spring.jpa.database-platform)

wxchong 2024-08-13 12:16:35 开源技术 16 ℃ 0 评论

概述

JPA全称Java Persistence API,本文介绍如何以Hibernate作为持久化服务提供方,配置和使用Spring JPA 操作存储层。

Spring Boot JPA配置

Spring Boot项目通过使用各种Starter和自动配置,旨在使创建Spring应用程序更快、更容易,JPA就是其中之一。

  • Maven依赖

要在Spring Boot应用程序中启用JPA,我们需要spring-boot-starter和spring-boot-starter-data-jpa依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>

spring-boot-starter包含Spring JPA所需的自动配置。spring-boot-starter-data-jpa引用了所有必要的依赖项,如hibernate-core。

  • 配置

Spring Boot将Hibernate配置为默认的JPA服务提供方,因此不再需要定义entityManagerFactory bean。

Spring Boot还可以根据我们使用的数据库自动配置dataSource bean。对于H2、HSQLDB和ApacheDerby类型的内存中数据库,如果类路径上存在相应的数据库依赖关系,会自动配置DataSource。

例如,如果我们想在Spring Boot JPA应用程序中使用H2内存数据库,我只需要将H2依赖项添加到pom.xml文件中:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>2.1.214</version>
</dependency>

如果我们想在MySQL数据库中使用JPA,我们需要mysql-connector-java依赖,还需要定义DataSource配置:

@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 Boot2开始默认数据库连接池已更改为HikariCP。

Spring JPA配置

使用Spring Boot配置JPA相当简单。然而如果我们有一个标准的Spring项目,则需要使用Java或XML进行相应的配置。

  • Maven依赖
<dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-core</artifactId>
   <version>5.2.17.Final</version>
   <scope>runtime</scope>
</dependency>

<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>8.0.19</version>
   <scope>runtime</scope>
</dependency>
  • Java配置

要在Spring项目中使用JPA,我们需要设置EntityManager。可以通过Spring factory bean来实现。可以用简单的LocalEntityManagerFactoryBean,或是更灵活的LocalContainerEntityManagerFactoryBean。

@Configuration
@EnableTransactionManagement
public class PersistenceJPAConfig{

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

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

      return em;
   }
   
   // ...

}

还需要显式定义使用的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 properties、TransactionManager和exceptionTranslation bean:

@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;
}
  • 使用XML配置JPA
<bean id="myEmf" 
  class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="com.spring.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.cj.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" />

XML和基于Java的配置之间的差异相对较小。在XML中,对另一个bean的引用可以指向该bean或其bean factory。

但在Java中,由于类型不同,编译器不允许这样做,因此EntityManagerFactory首先从其bean factory中检索,然后传递给事务管理器:

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

从Spring 3.1开始,LocalContainerEntityManagerFactoryBean支持packagesToScan属性,指定要扫描@Entity类的包。

结论

本文说明了Hibernate和JPA之间的关系,对比了Spring Boot和标准Spring应用程序中使用Hibernate配置JPA的不同。接下来我们可以继续看看如何使用JPA。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表