此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Data JPA 3.4.0spring-doc.cadn.net.cn

配置

本节介绍如何通过以下任一方式配置 Spring Data JPA:spring-doc.cadn.net.cn

基于注释的配置

Spring Data JPA 存储库支持可以通过 JavaConfig 以及自定义 XML 名称空间激活,如以下示例所示:spring-doc.cadn.net.cn

示例 1.使用 JavaConfig 的 Spring Data JPA 存储库
@Configuration
@EnableJpaRepositories
@EnableTransactionManagement
class ApplicationConfig {

  @Bean
  public DataSource dataSource() {

    EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
    return builder.setType(EmbeddedDatabaseType.HSQL).build();
  }

  @Bean
  public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    vendorAdapter.setGenerateDdl(true);

    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
    factory.setJpaVendorAdapter(vendorAdapter);
    factory.setPackagesToScan("com.acme.domain");
    factory.setDataSource(dataSource());
    return factory;
  }

  @Bean
  public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {

    JpaTransactionManager txManager = new JpaTransactionManager();
    txManager.setEntityManagerFactory(entityManagerFactory);
    return txManager;
  }
}
您必须创建LocalContainerEntityManagerFactoryBean而不是EntityManagerFactory直接,因为前者除了创建EntityManagerFactory.

前面的配置类使用EmbeddedDatabaseBuilderAPI 的spring-jdbc.然后,Spring Data 会设置一个EntityManagerFactory并使用 Hibernate 作为示例持久性提供程序。此处声明的最后一个基础设施组件是JpaTransactionManager.最后,该示例使用@EnableJpaRepositories注释,它实质上具有与 XML 命名空间相同的属性。如果未配置基础包,则使用配置类所在的基础包。spring-doc.cadn.net.cn

Spring 命名空间

Spring Data 的 JPA 模块包含一个允许定义存储库 bean 的自定义命名空间。它还包含 JPA 特有的某些功能和元素属性。通常,可以使用repositories元素,如以下示例所示:spring-doc.cadn.net.cn

示例 2.使用命名空间设置 JPA 存储库
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:jpa="http://www.springframework.org/schema/data/jpa"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    https://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/data/jpa
    https://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

  <jpa:repositories base-package="com.acme.repositories" />

</beans>
JavaConfig 和 XML 哪个更好?XML 是很久以前 Spring 的配置方式。在当今 Java、记录类型、注释等快速增长的时代,新项目通常会尽可能多地使用纯 Java。虽然目前没有删除 XML 支持的计划,但某些最新功能可能无法通过 XML 获得。

使用repositories元素中,它为所有带有 Comments 的 bean 激活持久性异常转换@Repository,以便将 JPA 持久化提供程序引发的异常转换为 Spring 的DataAccessException等级制度。spring-doc.cadn.net.cn

自定义命名空间属性

除了repositories元素中,JPA 命名空间提供了额外的属性,让您能够更详细地控制存储库的设置:spring-doc.cadn.net.cn

表 1.自定义 JPA 特定属性repositories元素

entity-manager-factory-refspring-doc.cadn.net.cn

显式连接EntityManagerFactoryrepositories元素。通常用于多个EntityManagerFactorybean 在应用程序中使用。如果未配置,则 Spring Data 会自动查找EntityManagerFactory名称为entityManagerFactoryApplicationContext.spring-doc.cadn.net.cn

transaction-manager-refspring-doc.cadn.net.cn

显式连接PlatformTransactionManagerrepositories元素。通常仅在多个事务管理器或EntityManagerFactorybean 已配置。默认为单个已定义的PlatformTransactionManager在电流ApplicationContext.spring-doc.cadn.net.cn

Spring Data JPA 需要一个PlatformTransactionManager名为transactionManager如果没有显式transaction-manager-ref已定义。

Bootstrap 模式

默认情况下,Spring Data JPA 存储库是默认的 Spring Bean。 它们是单例范围的,并且是 argered 初始化的。 在启动期间,它们已经与 JPA 进行了交互EntityManager用于验证和元数据分析目的。 Spring Framework 支持 JPA 的初始化EntityManagerFactory在后台线程中,因为该进程通常会在 Spring 应用程序中占用大量的启动时间。 为了有效地利用该后台初始化,我们需要确保 JPA 存储库尽可能晚地初始化。spring-doc.cadn.net.cn

从 Spring Data JPA 2.1 开始,您现在可以配置一个BootstrapMode(通过@EnableJpaRepositoriesannotation 或 XML 命名空间),它采用以下值:spring-doc.cadn.net.cn

  • DEFAULT(默认) — 存储库会预先实例化,除非显式使用@Lazy. 仅当没有客户端 Bean 需要存储库的实例时,lazification 才有效,因为这需要初始化存储库 Bean。spring-doc.cadn.net.cn

  • LAZY— 隐式声明所有存储库 bean 为惰性,并且还会导致创建惰性初始化代理以注入到客户端 bean 中。 这意味着,如果客户端 Bean 只是将实例存储在字段中,并且在初始化期间不使用存储库,则不会实例化存储库。 存储库实例将在首次与存储库交互时进行初始化和验证。spring-doc.cadn.net.cn

  • DEFERRED— 基本相同的作模式LAZY,但会触发存储库初始化以响应ContextRefreshedEvent以便在应用程序完全启动之前验证存储库。spring-doc.cadn.net.cn

建议

如果您没有使用具有默认引导模式的异步 JPA 引导棒。spring-doc.cadn.net.cn

如果您异步引导 JPA,DEFERRED是一个合理的默认值,因为它将确保 Spring Data JPA 引导程序仅等待EntityManagerFactorysetup(如果这本身比初始化所有其他应用程序组件花费的时间长)。 尽管如此,它仍确保在应用程序发出启动信号之前正确初始化和验证存储库。spring-doc.cadn.net.cn

LAZY是测试场景和本地开发的不错选择。 一旦您非常确定存储库可以正确引导,或者在测试应用程序的其他部分的情况下,对所有存储库运行验证可能会不必要地增加启动时间。 这同样适用于本地开发,在这种开发中,您只访问可能需要初始化单个存储库的应用程序部分。spring-doc.cadn.net.cn