配置
本节描述了如何通过以下方式配置 Spring Data JPA:
-
“基于注解的配置”(Java 配置)
-
“Spring Namespace”(XML 配置)
基于注解的配置
通过 JavaConfig 和自定义 XML namespace 都可以激活 Spring Data JPA repository 支持,如下例所示
@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 外,还参与异常转换机制。 |
前面的配置类通过使用 spring-jdbc
的 EmbeddedDatabaseBuilder
API 设置了一个嵌入式 HSQL 数据库。然后 Spring Data 设置了一个 EntityManagerFactory
并使用 Hibernate 作为示例持久化提供者。这里声明的最后一个基础设施组件是 JpaTransactionManager
。最后,示例通过使用 @EnableJpaRepositories
注解激活了 Spring Data JPA repositories,该注解本质上与 XML namespace 具有相同的属性。如果未配置 base package,则使用配置类所在的 package。
Spring Namespace
Spring Data 的 JPA 模块包含一个自定义 namespace,允许定义 repository bean。它还包含一些 JPA 特有的特性和元素属性。通常,可以使用 repositories
元素来设置 JPA repositories,如下例所示
<?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 时代,record types、注解等更多特性出现,新项目通常尽可能使用纯 Java。虽然目前没有立即移除 XML 支持的计划,但一些最新的特性可能无法通过 XML 使用。 |
使用 repositories
元素可以激活所有带有 @Repository
注解的 bean 的持久化异常转换,以便将 JPA 持久化提供者抛出的异常转换为 Spring 的 DataAccessException
层次结构。
自定义 Namespace 属性
除了 repositories
元素的默认属性外,JPA namespace 还提供额外的属性,让您对 repository 的设置进行更精细的控制
|
显式关联 |
|
显式关联 |
如果未定义显式的 transaction-manager-ref ,Spring Data JPA 需要一个名为 transactionManager 的 PlatformTransactionManager bean。 |
引导模式 (Bootstrap Mode)
默认情况下,Spring Data JPA repositories 是默认的 Spring bean。它们是单例范围并急切初始化。在启动期间,它们已经与 JPA EntityManager
交互以进行验证和元数据分析。Spring Framework 支持在后台线程中初始化 JPA EntityManagerFactory
,因为该过程通常会占用 Spring 应用程序大量的启动时间。为了有效利用后台初始化,我们需要确保 JPA repositories 尽可能晚地初始化。
从 Spring Data JPA 2.1 开始,您现在可以配置一个 BootstrapMode
(通过 @EnableJpaRepositories
注解或 XML namespace),其取值如下
-
DEFAULT
(默认) — Repositories 会被急切实例化,除非显式注解了@Lazy
。懒加载仅在没有客户端 bean 需要 repository 实例时才有效,因为这会需要 repository bean 的初始化。 -
LAZY
— 隐式声明所有 repository bean 为懒加载,并创建懒加载初始化代理注入到客户端 bean 中。这意味着,如果客户端 bean 只是将实例存储在一个字段中并且在初始化期间没有使用 repository,则 repository 将不会被实例化。Repository 实例将在与 repository 首次交互时进行初始化和验证。 -
DEFERRED
— 操作模式与LAZY
基本相同,但在响应ContextRefreshedEvent
时触发 repository 初始化,以便在应用程序完全启动之前验证 repositories。
建议
如果您不使用异步 JPA 引导,请坚持使用默认的引导模式。
如果您异步引导 JPA,DEFERRED
是一个合理的默认值,因为它会确保 Spring Data JPA 引导仅在 EntityManagerFactory
本身设置所需时间长于初始化所有其他应用程序组件时才等待。尽管如此,它仍确保在应用程序发出启动信号之前 repositories 已正确初始化和验证。
LAZY
是测试场景和本地开发的一个不错的选择。一旦您相当确定 repositories 可以正确引导,或者在测试应用程序其他部分的情况下,对所有 repositories 运行验证可能会不必要地增加启动时间。对于您只访问应用程序部分(可能需要初始化单个 repository)的本地开发也是如此。