名稱空間支援
使用 XML 名稱空間支援時,底層解析器類會為您例項化相關的 Java 類。因此,您通常無需處理 JPA 介面卡的內部工作原理。本節文件記錄了 Spring Integration 提供的 XML 名稱空間支援,並展示瞭如何使用 XML 名稱空間支援來配置 JPA 元件。
通用 XML 名稱空間配置屬性
某些配置引數由所有 JPA 元件共享。
auto-startup
-
生命週期屬性,表示此元件是否應在應用程式上下文啟動期間啟動。預設為
true
。可選。 id
-
標識底層的 Spring bean 定義,它是
EventDrivenConsumer
或PollingConsumer
的例項。可選。 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
-
實體類的完全限定名。此屬性的確切語義因執行的是
persist
或update
操作,還是從資料庫檢索物件而異。檢索資料時,您可以指定
entity-class
屬性來表明您希望從資料庫中檢索此型別的物件。在這種情況下,您不得定義任何查詢屬性(jpa-query
、native-query
或named-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 操作(例如 INSERT
、UPDATE
和 DELETE
)在執行時都需要事務處於活動狀態。對於入站通道介面卡,您無需執行任何特殊操作。它的工作方式類似於我們使用輪詢器配置事務管理器的方式,輪詢器與其他入站通道介面卡一起使用。以下 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 名稱空間中定義。 |