配置

本节描述如何通过以下方式配置 Spring Data JPA:spring-doc.cadn.net.cn

基于注释的配置

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

例子1。Spring Data JPA 仓库使用 JavaConfig
@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;
  }
}
你必须创造LocalContainerEntityManagerFactoryBeanEntityManagerFactory直接,因为前者除了创建外,还参与异常翻译机制EntityManagerFactory.

前述配置类通过使用EmbeddedDatabaseBuilder的API春季-JDBC.Spring Data随后设置EntityManagerFactory并使用 Hibernate 作为样本持久化提供者。这里声明的最后一个基础设施组件是JpaTransactionManager.最后,示例通过使用@EnableJpaRepositories注释,本质上携带与XML命名空间相同的属性。如果没有配置基础包,则使用配置类所在的包。spring-doc.cadn.net.cn

春季命名空间

Spring Data 的 JPA 模块包含自定义命名空间,允许定义仓库 beans。它还包含了 JPA 特有的某些特征和元素属性。通常,JPA仓库可以通过以下方式建立存储 库如下例所示: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 哪个更好?Spring 很久以前就是用 XML 配置的。在当今 Java 快速发展、记录类型、注释等的时代,新项目通常会尽可能多地使用纯 Java。虽然目前没有立即移除 XML 支持的计划,但一些最新功能可能无法通过 XML 实现。

使用存储 库元素 它激活了所有注释为 的豆子的持久异常翻译@Repository,让JPA持久化提供者抛出的异常被转换为Spring的DataAccessException等级制度。spring-doc.cadn.net.cn

自定义命名空间属性

除了默认属性之外存储 库element,JPA 命名空间提供了额外的属性,让你能够更详细地控制仓库的设置:spring-doc.cadn.net.cn

表1。自定义的JPA特有属性存储 库元素

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

明确接线EntityManagerFactory用于被检测到的存储库存储 库元素。 通常用在多个人时EntityManagerFactoryBeans 在应用中被使用。如果未配置,Spring Data 会自动查找EntityManagerFactory豆子的名字entityManagerFactory应用上下文.spring-doc.cadn.net.cn

事务管理-参考spring-doc.cadn.net.cn

明确接线PlatformTransactionManager用于被检测到的存储库存储 库元素。 通常只有在多个事务管理器或EntityManagerFactory豆子已配置好。默认为单一定义PlatformTransactionManager在当前的内部应用上下文.spring-doc.cadn.net.cn

Spring Data JPA 要求PlatformTransactionManager豆子命名transactionManager如果没有明确的,则必须存在事务管理-参考定义了。

引导模式

默认情况下,Spring Data JPA 仓库是默认的 Spring Beans。它们是单例范围的,并且已经被积极初始化。启动时,它们已经与 JPA 进行了交互实体管理器用于验证和元数据分析目的。Spring Framework 支持 JPA 的初始化EntityManagerFactory因为在 Spring 应用中,这个过程通常会占用大量启动时间。为了有效利用后台初始化,我们需要确保 JPA 仓库的初始化尽可能晚。spring-doc.cadn.net.cn

从 Spring Data JPA 2.1 起,你现在可以配置自助模式(无论是通过@EnableJpaRepositories注释或XML命名空间)取以下值:spring-doc.cadn.net.cn

  • 默认值(默认)——除非明确注释为@Lazy. lazification 只有在没有客户端 bean 需要仓库实例时才生效,因为那需要初始化仓库 bean。spring-doc.cadn.net.cn

  • 懒惰—— 隐式声明所有仓库 Beans 为懒惰,并促使创建懒惰初始化代理注入客户端 Beans。这意味着,如果客户端 Bean 仅将实例存储在字段中,且在初始化时未使用仓库,仓库将不会被实例化。仓库实例将在首次与仓库交互时被初始化和验证。spring-doc.cadn.net.cn

  • 递 延— 基本的作模式与懒惰但会触发仓库初始化,响应ContextRefreshedEvent这样在申请完全开始之前,仓库就能得到验证。spring-doc.cadn.net.cn

建议

如果你没有使用异步JPA引导模式,建议使用默认引导模式。spring-doc.cadn.net.cn

如果你是异步引导JPA,递 延是合理的默认选择,因为它会确保 Spring Data JPA 引导只等待EntityManagerFactory如果这本身比初始化所有其他应用组件花费更长时间,那也值得设置。不过,它确保仓库在应用程序上线信号前已正确初始化和验证。spring-doc.cadn.net.cn

懒惰是测试场景和本地开发的不错选择。一旦你确定仓库能正确引导,或者在测试应用其他部分的情况下,对所有仓库进行验证可能会不必要地增加启动时间。本地开发也是如此,你只访问可能需要初始化单个仓库的应用部分。spring-doc.cadn.net.cn