命名空間支援
當使用 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 命名空間中定義的。 |