命名空间支持
当使用 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持久化查询语言)。
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>
在前面的示例中,出站网关或适配器的transactional
元素指定了事务属性。如果您将DirectChannel
用作适配器的输入通道,并且希望适配器在与调用者相同的事务上下文中执行操作,则定义此子元素是可选的。但是,如果您使用ExecutorChannel
,则必须使用transactional
元素,因为调用客户端的事务上下文不会传播。
与在 Spring Integration 命名空间中定义的轮询器 transactional 元素不同,用于出站网关或适配器的 transactional 元素是在 JPA 命名空间中定义的。
|