名稱空間支援
當使用 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 持久化查詢語言 (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>
在前面的示例中,出站閘道器或介面卡的事務性元素指定了事務屬性。如果您將 DirectChannel 作為介面卡的輸入通道,並且希望介面卡在與呼叫者相同的事務上下文中執行操作,則定義此子元素是可選的。但是,如果您使用 ExecutorChannel,則必須具有 transactional 元素,因為呼叫客戶端的事務上下文不會傳播。
與 Spring Integration 名稱空間中定義的輪詢器的 transactional 元素不同,出站閘道器或介面卡的 transactional 元素在 JPA 名稱空間中定義。 |