命名空间支持

使用 XML 名称空间支持时,底层解析器类会为您实例化相关的 Java 类。 因此,您通常不需要处理 JPA 适配器的内部工作原理。 本节记录了 Spring 集成提供的 XML 名称空间支持,并向您展示如何使用 XML 名称空间支持来配置 JPA 组件。spring-doc.cadn.net.cn

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

某些配置参数由所有 JPA 组件共享:spring-doc.cadn.net.cn

auto-startup

Lifecycle 属性,用于指示是否应在应用程序上下文启动期间启动此组件。 默认为true. 自选。spring-doc.cadn.net.cn

id

标识底层 Spring Bean 定义,它是EventDrivenConsumerPollingConsumer. 自选。spring-doc.cadn.net.cn

entity-manager-factory

对适配器用于创建EntityManager. 您必须提供此属性entity-manager属性或jpa-operations属性。spring-doc.cadn.net.cn

entity-manager

对组件使用的 JPA 实体管理器的引用。 您必须提供此属性entity-manager-factory属性或jpa-operations属性。spring-doc.cadn.net.cn

通常,Spring 应用程序上下文只定义一个 JPA 实体管理器工厂,而EntityManager使用@PersistenceContext注解。 这种方法不适用于 Spring 集成 JPA 组件。 通常,注入 JPA 实体管理器工厂是最好的,但是,当您想注入EntityManager显式地,您必须定义一个SharedEntityManagerBean. 有关更多信息,请参阅相关的 Javadoc

以下示例显示了如何显式包含实体管理器工厂:spring-doc.cadn.net.cn

<bean id="entityManager"
      class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
    <property name="entityManagerFactory" ref="entityManagerFactoryBean" />
</bean>
jpa-operations

对实现JpaOperations接口。 在极少数情况下,建议您提供自己的JpaOperations接口,而不是依赖默认实现 (org.springframework.integration.jpa.core.DefaultJpaOperations). 如果您使用jpa-operations属性,则不得提供 JPA 实体管理器或 JPA 实体管理器工厂,因为JpaOperations包装必要的 DataSource。spring-doc.cadn.net.cn

entity-class

实体类的完全限定名称。 这个 attribute 的确切语义会有所不同,具体取决于我们是否执行persistupdate作,或者我们是否要从数据库中检索对象。spring-doc.cadn.net.cn

在检索数据时,您可以指定entity-class属性来指示您希望从数据库中检索此类型的对象。 在这种情况下,您不得定义任何查询属性 (jpa-query,native-querynamed-query).spring-doc.cadn.net.cn

持久保存数据时,entity-classattribute 指示要保留的对象类型。 如果未指定(用于持久作),则会自动从消息的有效负载中检索实体类。spring-doc.cadn.net.cn

jpa-query

定义要使用的 JPA 查询 (Java 持久性查询语言)。spring-doc.cadn.net.cn

native-query

定义要使用的本机 SQL 查询。spring-doc.cadn.net.cn

named-query

引用命名查询。 命名查询可以在 Native SQL 或 JPAQL 中定义,但底层 JPA 持久性提供程序在内部处理这种区别。spring-doc.cadn.net.cn

提供 JPA 查询参数

要提供参数,您可以使用parameterXML 元素。 它具有一种机制,允许您为基于 Java 持久性查询语言 (JPQL) 或本机 SQL 查询的查询提供参数。 您还可以为命名查询提供参数。spring-doc.cadn.net.cn

基于表达式的参数

以下示例演示如何设置基于表达式的参数:spring-doc.cadn.net.cn

<int-jpa:parameter expression="payload.name" name="firstName"/>
基于值的参数

以下示例演示如何设置基于值的参数:spring-doc.cadn.net.cn

<int-jpa:parameter name="name" type="java.lang.String" value="myName"/>
位置参数

以下示例演示如何设置基于表达式的参数:spring-doc.cadn.net.cn

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

事务处理

所有 JPA作(例如INSERT,UPDATEDELETE) 要求事务在执行时处于活动状态。 对于入站通道适配器,您无需执行任何特殊作。 它的工作方式类似于我们使用与其他入站通道适配器一起使用的 Poller 配置事务管理器的方式。 下面的 XML 示例配置了一个事务管理器,该事务管理器使用带有入站通道适配器的 Poller :spring-doc.cadn.net.cn

<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是出站适配器或网关的 input 通道,如果事务在当前执行线程中处于活动状态,则 JPA作将在同一事务上下文中执行。 您还可以将此 JPA作配置为作为新事务运行,如下例所示:spring-doc.cadn.net.cn

<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作为适配器的 input 通道,并且您希望适配器在与调用者相同的事务上下文中执行作。 但是,如果您使用ExecutorChannel,您必须具有transactional元素,因为调用客户端的事务上下文不会传播。spring-doc.cadn.net.cn

transactional元素,该元素在 Spring Integration 的名称空间中定义,transactional元素在 JPA 命名空间中定义。