跳到主要内容

命名空间支持

QWen Plus 中英对照 Namespace Support

当使用 XML 命名空间支持时,底层解析器类会为您实例化相关的 Java 类。因此,您通常不需要处理 JPA 适配器的内部工作。本节介绍了 Spring Integration 提供的 XML 命名空间支持,并向您展示如何使用 XML 命名空间支持来配置 JPA 组件。

常见的 XML 命名空间配置属性

某些配置参数由所有 JPA 组件共享:

auto-startup

生命周期属性,用于指示是否应在应用程序上下文启动期间启动此组件。默认为 true。可选。

id

标识底层的 Spring bean 定义,可以是 EventDrivenConsumerPollingConsumer 的实例。可选。

实体管理工厂

适配器用于创建 EntityManager 的 JPA 实体管理工厂的引用。你必须提供此属性、entity-manager 属性或 jpa-operations 属性。

实体管理器

组件使用的 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>
xml

jpa-operations

一个实现 JpaOperations 接口的 bean 的引用。在极少数情况下,提供自己的 JpaOperations 接口实现可能比依赖默认实现(org.springframework.integration.jpa.core.DefaultJpaOperations)更为可取。如果你使用 jpa-operations 属性,则不得提供 JPA 实体管理器或 JPA 实体管理器工厂,因为 JpaOperations 会包装必要的数据源。

实体类

实体类的完全限定名称。此属性的确切语义取决于我们是执行 persistupdate 操作,还是从数据库中检索对象。

在检索数据时,你可以指定 entity-class 属性来表示你希望从数据库中检索这种类型的对象。在这种情况下,你不应定义任何查询属性(jpa-querynative-querynamed-query)。

在持久化数据时,entity-class 属性表示要持久化的对象类型。如果没有指定(对于持久化操作),实体类将自动从消息的有效负载中检索。

jpa-query

定义要使用的 JPA 查询(Java 持久化查询语言)。

native-query

定义要使用的原生 SQL 查询。

命名查询

指的是命名查询。命名查询可以使用 Native SQL 或 JPAQL 定义,但底层的 JPA 持久性提供程序在内部处理这种区别。

提供 JPA 查询参数

要提供参数,你可以使用 parameter XML 元素。它有一个机制,可以让你为基于 Java Persistence Query Language (JPQL) 或原生 SQL 查询的查询提供参数。你也可以为命名查询提供参数。

基于表达式的参数

以下示例展示了如何设置基于表达式的参数:

<int-jpa:parameter expression="payload.name" name="firstName"/>
xml

基于值的参数

以下示例展示了如何设置基于值的参数:

<int-jpa:parameter name="name" type="java.lang.String" value="myName"/>
xml

位置参数

以下示例展示了如何设置基于表达式的参数:

<int-jpa:parameter expression="payload.name"/>
<int-jpa:parameter type="java.lang.Integer" value="21"/>
xml

事务处理

所有 JPA 操作(如 INSERTUPDATEDELETE)在执行时都需要有一个活动的事务。对于入站通道适配器,您不需要做任何特殊的事情。它的运作方式与我们配置轮询器使用的事务管理器类似,这些轮询器用于其他入站通道适配器。以下 XML 示例配置了一个使用轮询器的事务管理器,该轮询器与入站通道适配器一起使用:

<transaction:annotation-driven />
<int:poller fixed-delay="5000" task-executor="taskExecutor">
<transaction:synchronization-factory />
</int:poller>
<int-jpa:inbound-channel-adapter entity-manager="entityManager" channel="inputChannel">
<int:poller ref="poller" />
</int-jpa:inbound-channel-adapter>
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>
xml

但是,在使用 outbound 通道适配器或网关时,您可能需要显式启动一个事务。如果 DirectChannel 是 outbound 适配器或网关的输入通道,并且当前执行线程中的事务处于活动状态,则 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>
xml

在前面的例子中,传出网关或适配器的事务元素指定了事务属性。如果将 DirectChannel 作为适配器的输入通道,并且希望适配器在与调用者相同的事务上下文中执行操作,则定义这个子元素是可选的。但是,如果您使用的是 ExecutorChannel,则必须有 transactional 元素,因为调用客户端的事务上下文不会被传播。

备注

与在 Spring Integration 的命名空间中定义的轮询器的 transactional 元素不同, outbound gateway 或适配器的 transactional 元素是在 JPA 命名空间中定义的。