|
如需使用最新稳定版本,请使用 Spring Integration 7.0.4! |
命名空间支持
当使用 XML 命名空间支持时,底层的解析器类会为您实例化相关的 Java 类。 因此,您通常无需处理 JPA 适配器的内部工作原理。 本节记录了 Spring Integration 提供的 XML 命名空间支持,并展示了如何使用该命名空间支持来配置 JPA 组件。
通用 XML 命名空间配置属性
某些配置参数被所有 JPA 组件共享:
auto-startup-
指示该组件是否在应用上下文启动期间启动的生命周期属性。 默认为
true。 可选。 id-
标识底层的 Spring bean 定义,它是
EventDrivenConsumer或PollingConsumer的实例。 可选。 entity-manager-factory-
适配器用于创建
EntityManager的JPA实体管理器工厂的引用。 您必须提供此属性、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 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>
在前面的示例中,出站网关或适配器的事务元素指定了事务属性。
如果您将DirectChannel作为适配器的输入通道,并希望适配器在与调用者相同的事务上下文中执行操作,则定义此子元素是可选的。
然而,如果您使用ExecutorChannel,则必须包含transactional元素,因为调用方的事务上下文不会被传播。
与在 Spring Integration 命名空间中定义的轮询器的 transactional 元素不同,出站网关或适配器的 transactional 元素是在 JPA 命名空间中定义的。 |