命名空间支持

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

通用 XML 命名空间配置属性

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

auto-startup

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

id

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

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

实体类的完全限定名。此属性的确切语义因执行的是 persistupdate 操作,还是从数据库检索对象而异。

检索数据时,您可以指定 entity-class 属性来表明您希望从数据库中检索此类型的对象。在这种情况下,您不得定义任何查询属性(jpa-querynative-querynamed-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 操作(例如 INSERTUPDATEDELETE)在执行时都需要事务处于活动状态。对于入站通道适配器,您无需执行任何特殊操作。它的工作方式类似于我们使用轮询器配置事务管理器的方式,轮询器与其他入站通道适配器一起使用。以下 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 命名空间中定义。