配置
本节介绍如何通过以下两种方式配置 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 外,还参与异常转换机制。
|
前面的配置类使用 `spring-jdbc` 的 `EmbeddedDatabaseBuilder` API 设置了一个嵌入式 HSQL 数据库。然后,Spring Data 设置了一个 `EntityManagerFactory` 并使用 Hibernate 作为示例持久化提供程序。这里声明的最后一个基础设施组件是 `JpaTransactionManager`。最后,示例通过使用 `@EnableJpaRepositories` 注解激活 Spring Data JPA 存储库,该注解本质上与 XML 命名空间具有相同的属性。如果没有配置基本包,它将使用配置类所在的包。
Spring 命名空间
Spring Data 的 JPA 模块包含一个自定义命名空间,允许定义存储库 bean。它还包含某些特定于 JPA 的功能和元素属性。通常,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、记录类型、注解等快速发展的时代,新项目通常尽可能使用纯 Java。虽然没有立即计划删除 XML 支持,但一些最新的功能可能无法通过 XML 使用。 |
使用 `repositories` 元素,它会为所有使用 `@Repository` 注解的 bean 激活持久化异常转换,以使 JPA 持久化提供程序抛出的异常转换为 Spring 的 `DataAccessException` 层次结构。
自定义命名空间属性
除了 `repositories` 元素的默认属性之外,JPA 命名空间还提供其他属性,让您对存储库的设置有更详细的控制
|
显式连接要与 `repositories` 元素检测到的存储库一起使用的 `EntityManagerFactory`。通常在应用程序中使用多个 `EntityManagerFactory` bean 时使用。如果未配置,Spring Data 会自动在 `ApplicationContext` 中查找名为 `entityManagerFactory` 的 `EntityManagerFactory` bean。 |
|
显式连接要与 `repositories` 元素检测到的存储库一起使用的 `PlatformTransactionManager`。通常只有在配置了多个事务管理器或 `EntityManagerFactory` bean 时才需要。默认为当前 `ApplicationContext` 中定义的单个 `PlatformTransactionManager`。 |
如果未定义显式的 `transaction-manager-ref`,Spring Data JPA 需要一个名为 `transactionManager` 的 `PlatformTransactionManager` bean。 |
引导模式
默认情况下,Spring Data JPA 存储库是默认的 Spring bean。它们是单例作用域的,并且是急切初始化的。在启动期间,它们已经与 JPA `EntityManager` 交互以进行验证和元数据分析。Spring Framework 支持在后台线程中初始化 JPA `EntityManagerFactory`,因为该过程通常会占用 Spring 应用程序中大量的启动时间。为了有效地利用该后台初始化,我们需要确保 JPA 存储库尽可能晚地初始化。
从 Spring Data JPA 2.1 开始,您现在可以配置一个 `BootstrapMode`(通过 `@EnableJpaRepositories` 注解或 XML 命名空间),它接受以下值
-
DEFAULT
(默认)——除非显式使用@Lazy
注解,否则存储库将被立即实例化。如果没有任何客户端 Bean 需要存储库实例,则延迟化才会生效,因为这将需要初始化存储库 Bean。 -
LAZY
——隐式声明所有存储库 Bean 为延迟加载,并导致创建延迟加载代理以注入到客户端 Bean 中。这意味着,如果客户端 Bean 只是将实例存储在字段中,并且在初始化期间没有使用存储库,则存储库将不会被实例化。存储库实例将在第一次与存储库交互时被初始化和验证。 -
DEFERRED
——与LAZY
基本相同的工作模式,但响应ContextRefreshedEvent
触发存储库初始化,以便在应用程序完全启动之前验证存储库。