配置
本節介紹如何透過以下兩種方式配置 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 名稱空間還提供其他屬性,讓您對倉庫的設定進行更詳細的控制
|
顯式連線將與 |
|
顯式連線將與 |
如果未定義顯式 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觸發倉庫初始化,以便在應用程式完全啟動之前驗證倉庫。