名稱空間支援

使用 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 名稱空間中定義。