配置

本節介紹如何透過以下兩種方式配置 Spring Data JPA:

基於註解的配置

Spring Data JPA 倉庫支援可以透過 JavaConfig 和自定義 XML 名稱空間啟用,示例如下:

示例 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 外,還參與異常轉換機制。

上述配置類使用 spring-jdbcEmbeddedDatabaseBuilder API 設定了一個嵌入式 HSQL 資料庫。Spring Data 然後設定一個 EntityManagerFactory 並使用 Hibernate 作為示例永續性提供者。此處宣告的最後一個基礎設施元件是 JpaTransactionManager。最後,該示例透過使用 @EnableJpaRepositories 註解啟用 Spring Data JPA 倉庫,該註解本質上與 XML 名稱空間具有相同的屬性。如果未配置基本包,它將使用配置類所在的包。

Spring 名稱空間

Spring Data 的 JPA 模組包含一個自定義名稱空間,允許定義倉庫 bean。它還包含一些 JPA 特有的功能和元素屬性。通常,JPA 倉庫可以使用 repositories 元素設定,示例如下:

示例 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 元素它為所有使用 @Repository 註解的 bean 啟用永續性異常轉換,以便 JPA 永續性提供者丟擲的異常可以轉換為 Spring 的 DataAccessException 層次結構。

自定義名稱空間屬性

除了 repositories 元素的預設屬性外,JPA 名稱空間還提供其他屬性,讓您對倉庫的設定進行更詳細的控制

表 1. repositories 元素的自定義 JPA 特定屬性

entity-manager-factory-ref

顯式連線將與 repositories 元素檢測到的倉庫一起使用的 EntityManagerFactory。通常在應用程式中使用多個 EntityManagerFactory bean 時使用。如果未配置,Spring Data 會自動在 ApplicationContext 中查詢名為 entityManagerFactoryEntityManagerFactory bean。

transaction-manager-ref

顯式連線將與 repositories 元素檢測到的倉庫一起使用的 PlatformTransactionManager。通常僅在配置了多個事務管理器或 EntityManagerFactory bean 時才需要。預設為當前 ApplicationContext 中定義的單個 PlatformTransactionManager

如果未定義顯式 transaction-manager-ref,Spring Data JPA 需要存在名為 transactionManagerPlatformTransactionManager 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 觸發倉庫初始化,以便在應用程式完全啟動之前驗證倉庫。

建議

如果您不使用非同步 JPA 引導,請堅持使用預設的引導模式。

如果您非同步引導 JPA,DEFERRED 是一個合理的預設值,因為它將確保 Spring Data JPA 引導僅在 EntityManagerFactory 設定本身花費的時間比初始化所有其他應用程式元件更長時才等待。儘管如此,它仍確保在應用程式發出啟動訊號之前,倉庫已正確初始化和驗證。

LAZY 是測試場景和本地開發的好選擇。一旦您確定倉庫可以正常引導,或者在測試應用程式的其他部分時,為所有倉庫執行驗證可能會不必要地增加啟動時間。這同樣適用於本地開發,在本地開發中您只訪問可能需要初始化單個倉庫的應用程式部分。

© . This site is unofficial and not affiliated with VMware.