|
此版本仍在开发中,尚未被视为稳定版。如需使用最新的稳定版本,请访问 Spring Data JPA 4.0.4! |
配置
本节介绍通过以下任一方式配置 Spring Data JPA:
-
“基于注解的配置”(Java 配置)
-
“Spring 命名空间”(XML 配置)
基于注解的配置
Spring Data JPA 仓库支持可以通过 JavaConfig 和自定义 XML 命名空间进行激活,如下示例所示:
@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 之外,还会参与异常转换机制。 |
上述配置类通过使用 EmbeddedDatabaseBuilder 的 spring-jdbc API 设置了一个嵌入式 HSQL 数据库。随后,Spring Data 会设置一个 EntityManagerFactory,并使用 Hibernate 作为示例的持久化提供者。此处声明的最后一个基础设施组件是 JpaTransactionManager。最后,该示例通过使用 @EnableJpaRepositories 注解来激活 Spring Data JPA 仓库,该注解本质上具有与 XML 命名空间相同的属性。如果没有配置基础包,则会使用配置类所在的包。
Spring 命名空间
Spring Data 的 JPA 模块包含一个自定义命名空间,可用于定义仓库(repository)Bean。它还包含一些专属于 JPA 的特性和元素属性。通常,可以通过使用 repositories 元素来配置 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 快速发展、记录类(record types)、注解等特性不断涌现的时代,新项目通常会尽可能多地使用纯 Java 配置。虽然目前尚无立即移除 XML 支持的计划,但一些最新特性可能无法通过 XML 使用。 |
使用 repositories 元素可以为所有带有 @Repository 注解的 Bean 启用持久化异常转换,从而将 JPA 持久化提供程序抛出的异常转换为 Spring 的 DataAccessException 异常体系。
自定义命名空间属性
除了 repositories 元素的默认属性外,JPA 命名空间还提供了额外的属性,使您能够更精细地控制仓库的配置:
|
显式地将 |
|
显式地指定要与 |
如果未显式定义 PlatformTransactionManager,Spring Data JPA 要求存在一个名为 transactionManager 的 transaction-manager-ref Bean。 |
引导模式
默认情况下,Spring Data JPA 仓库是普通的 Spring Bean。
它们的作用域为单例(singleton),并且会被急切地初始化。
在启动期间,它们就已经与 JPA EntityManager 进行交互,用于验证和元数据分析。
Spring 框架支持在后台线程中初始化 JPA EntityManagerFactory,因为该过程通常会占用 Spring 应用启动时的大量时间。
为了有效利用这种后台初始化机制,我们需要确保 JPA 仓库尽可能晚地进行初始化。
从 Spring Data JPA 2.1 开始,您现在可以配置一个 BootstrapMode(通过 @EnableJpaRepositories 注解或 XML 命名空间),其取值如下:
-
DEFAULT(默认)—— 仓库会被急切地实例化,除非显式使用@Lazy注解。 仅当没有任何客户端 Bean 需要该仓库的实例时,延迟初始化才会生效,因为一旦有客户端需要仓库实例,就会触发仓库 Bean 的初始化。 -
LAZY—— 隐式地将所有 Repository Bean 声明为懒加载,并且还会创建懒初始化代理注入到客户端 Bean 中。 这意味着,如果客户端 Bean 仅将 Repository 实例存储在字段中,并且在初始化期间未使用该 Repository,则 Repository 不会被实例化。 Repository 实例将在首次与 Repository 交互时进行初始化和验证。 -
DEFERRED— 本质上与LAZY操作模式相同,但会在接收到ContextRefreshedEvent事件时触发仓库的初始化,从而在应用程序完全启动之前验证仓库。
推荐
如果你不使用异步 JPA 引导,请坚持使用默认的引导模式。
如果你以异步方式引导 JPA,DEFERRED 是一个合理的默认值,因为它会确保 Spring Data JPA 的引导过程仅在 EntityManagerFactory 的设置时间超过其他所有应用程序组件的初始化时间时,才等待其完成。
尽管如此,它仍能确保在应用程序发出“已启动”信号之前,仓库(repositories)已被正确初始化和验证。
LAZY 是测试场景和本地开发的一个不错的选择。
一旦你确信仓库能够正确启动,或者在测试应用程序其他部分的情况下,对所有仓库执行验证可能会不必要地增加启动时间。
同样的情况也适用于本地开发,此时你可能只访问应用程序中需要初始化单个仓库的部分。