命名空間支援

當使用 XML 命名空間支援時,底層的剖析器類別會為您實例化相關的 Java 類別。因此,您通常不需要處理 JPA 配接器的內部運作。本節說明 Spring Integration 提供的 XML 命名空間支援,並向您展示如何使用 XML 命名空間支援來設定 JPA 元件。

常用 XML 命名空間設定屬性

某些設定參數由所有 JPA 元件共用

auto-startup

生命週期屬性,表示此元件是否應在應用程式內容啟動期間啟動。預設為 true。選填。

id

識別底層的 Spring Bean 定義,它是 EventDrivenConsumerPollingConsumer 的實例。選填。

entity-manager-factory

對 JPA 實體管理器工廠的參考,配接器使用它來建立 EntityManager。您必須提供此屬性、entity-manager 屬性或 jpa-operations 屬性。

entity-manager

對 JPA 實體管理器的參考,元件使用它。您必須提供此屬性、entity-manager-factory 屬性或 jpa-operations 屬性。

通常,您的 Spring 應用程式內容僅定義 JPA 實體管理器工廠,而 EntityManager 是透過使用 @PersistenceContext 註解注入的。此方法不適用於 Spring Integration JPA 元件。通常,注入 JPA 實體管理器工廠是最佳做法,但是,當您想要明確注入 EntityManager 時,您必須定義 SharedEntityManagerBean。如需更多資訊,請參閱相關的 Javadoc

以下範例顯示如何明確包含實體管理器工廠

<bean id="entityManager"
      class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
    <property name="entityManagerFactory" ref="entityManagerFactoryBean" />
</bean>
jpa-operations

對實作 JpaOperations 介面的 Bean 的參考。在極少數情況下,建議您提供自己的 JpaOperations 介面實作,而不是依賴預設實作 (org.springframework.integration.jpa.core.DefaultJpaOperations)。如果您使用 jpa-operations 屬性,則不得提供 JPA 實體管理器或 JPA 實體管理器工廠,因為 JpaOperations 包裝了必要的資料來源。

entity-class

實體類別的完整限定名稱。此屬性的確切語意會有所不同,具體取決於我們是否執行 persistupdate 操作,或者我們是否從資料庫擷取物件。

當擷取資料時,您可以指定 entity-class 屬性,以指示您想要從資料庫擷取此類型的物件。在這種情況下,您不得定義任何查詢屬性 (jpa-querynative-querynamed-query)。

當持久化資料時,entity-class 屬性指示要持久化的物件類型。如果未指定 (對於持久化操作),則會自動從訊息的酬載中擷取實體類別。

jpa-query

定義要使用的 JPA 查詢 (Java Persistence Query Language)。

native-query

定義要使用的原生 SQL 查詢。

named-query

參考具名查詢。具名查詢可以在原生 SQL 或 JPAQL 中定義,但底層 JPA 持久性提供者會在內部處理這種區別。

提供 JPA 查詢參數

若要提供參數,您可以使用 parameter XML 元素。它具有一種機制,可讓您為基於 Java Persistence Query Language (JPQL) 或原生 SQL 查詢的查詢提供參數。您也可以為具名查詢提供參數。

基於運算式的參數

以下範例顯示如何設定基於運算式的參數

<int-jpa:parameter expression="payload.name" name="firstName"/>
基於值的參數

以下範例顯示如何設定基於值的參數

<int-jpa:parameter name="name" type="java.lang.String" value="myName"/>
位置參數

以下範例顯示如何設定基於運算式的參數

<int-jpa:parameter expression="payload.name"/>
<int-jpa:parameter type="java.lang.Integer" value="21"/>

交易處理

所有 JPA 操作 (例如 INSERTUPDATEDELETE) 都需要在執行時處於作用中的交易。對於輸入通道配接器,您無需執行任何特殊操作。它的運作方式與我們設定交易管理器的方式類似,交易管理器與用於其他輸入通道配接器的輪詢器搭配使用。以下 XML 範例設定使用包含輸入通道配接器的輪詢器的交易管理器

<int-jpa:inbound-channel-adapter
    channel="inboundChannelAdapterOne"
    entity-manager="em"
    auto-startup="true"
    jpa-query="select s from Student s"
    expect-single-result="true"
    delete-after-poll="true">
    <int:poller fixed-rate="2000" >
        <int:transactional propagation="REQUIRED"
            transaction-manager="transactionManager"/>
    </int:poller>
</int-jpa:inbound-channel-adapter>

但是,當使用輸出通道配接器或閘道時,您可能需要特別啟動交易。如果 DirectChannel 是輸出配接器或閘道的輸入通道,且交易在目前的執行緒中處於作用中狀態,則 JPA 操作會在相同的交易內容中執行。您也可以將此 JPA 操作設定為以新交易執行,如下列範例所示

<int-jpa:outbound-gateway
    request-channel="namedQueryRequestChannel"
    reply-channel="namedQueryResponseChannel"
    named-query="updateStudentByRollNumber"
    entity-manager="em"
    gateway-type="UPDATING">
    <int-jpa:parameter name="lastName" expression="payload"/>
    <int-jpa:parameter name="rollNumber" expression="headers['rollNumber']"/>
		<int-jpa:transactional propagation="REQUIRES_NEW"
        transaction-manager="transactionManager"/>
</int-jpa:outbound-gateway>

在上述範例中,輸出閘道或配接器的 transactional 元素指定了交易屬性。如果您將 DirectChannel 作為配接器的輸入通道,並且您希望配接器在與呼叫者相同的交易內容中執行操作,則定義此子元素是選填的。但是,如果您使用 ExecutorChannel,則必須具有 transactional 元素,因為不會傳播叫用用戶端的交易內容。

與 Spring Integration 命名空間中定義的輪詢器的 transactional 元素不同,輸出閘道或配接器的 transactional 元素是在 JPA 命名空間中定義的。