使用 XML 名称空间支持时,底层解析器类会为您实例化相关的 Java 类。 因此,您通常不需要处理 JPA 适配器的内部工作原理。 本节记录了 Spring 集成提供的 XML 名称空间支持,并向您展示如何使用 XML Namespace 支持来配置 JPA 组件。
常见的 XML Namespace 配置属性
某些配置参数由所有 JPA 组件共享:
auto-startup
-
Lifecycle 属性,用于指示是否应在应用程序上下文启动期间启动此组件。 默认为 。 自选。
true
id
-
标识基础 Spring Bean 定义,该定义是 或 的实例。 自选。
EventDrivenConsumer
PollingConsumer
entity-manager-factory
-
对适配器用于创建 . 您必须提供此属性、属性或属性。
EntityManager
entity-manager
jpa-operations
entity-manager
-
对组件使用的 JPA 实体管理器的引用。 您必须提供此属性、属性或属性。
entity-manager-factory
jpa-operations
通常,您的 Spring 应用程序上下文仅定义一个 JPA 实体管理器工厂,并且使用注释注入该工厂。 这种方法不适用于 Spring 集成 JPA 组件。 通常,注入 JPA 实体管理器工厂是最好的,但是,当您想显式注入 . 有关更多信息,请参阅相关的 Javadoc。 EntityManager
@PersistenceContext
EntityManager
SharedEntityManagerBean
以下示例显示了如何显式包含实体管理器工厂:
<bean id="entityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean"> <property name="entityManagerFactory" ref="entityManagerFactoryBean" /> </bean>
jpa-operations
-
对实现接口的 bean 的引用。 在极少数情况下,最好提供您自己的接口实现,而不是依赖默认实现 ()。 如果使用该属性,则不得提供 JPA 实体管理器或 JPA 实体管理器工厂,因为会包装必要的数据源。
JpaOperations
JpaOperations
org.springframework.integration.jpa.core.DefaultJpaOperations
jpa-operations
JpaOperations
entity-class
-
实体类的完全限定名称。 此属性的确切语义会有所不同,具体取决于我们是执行 or 操作,还是从数据库中检索对象。
persist
update
检索数据时,您可以指定属性以指示要从数据库中检索此类型的对象。 在这种情况下,您不得定义任何查询属性 (, , 或 )。
entity-class
jpa-query
native-query
named-query
在持久保存数据时,该属性指示要持久保存的对象类型。 如果未指定(对于持久操作),则会自动从消息的有效负载中检索实体类。
entity-class
jpa-query
-
定义要使用的 JPA 查询 (Java 持久性查询语言)。
native-query
-
定义要使用的本机 SQL 查询。
named-query
-
引用命名查询。 命名查询可以在 Native SQL 或 JPAQL 中定义,但底层 JPA 持久性提供程序在内部处理这种区别。
通常,您的 Spring 应用程序上下文仅定义一个 JPA 实体管理器工厂,并且使用注释注入该工厂。
这种方法不适用于 Spring 集成 JPA 组件。
通常,注入 JPA 实体管理器工厂是最好的,但是,当您想显式注入 .
有关更多信息,请参阅相关的 Javadoc。EntityManager @PersistenceContext EntityManager SharedEntityManagerBean |
提供 JPA 查询参数
若要提供参数,可以使用 XML 元素。
它具有一种机制,允许您为基于 Java 持久性查询语言 (JPQL) 或本机 SQL 查询的查询提供参数。
您还可以为命名查询提供参数。parameter
- 基于表达式的参数
-
以下示例演示如何设置基于表达式的参数:
<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操作(例如 , , 和 )都要求事务在执行时处于活动状态。
对于入站通道适配器,您无需执行任何特殊操作。
它的工作方式类似于我们使用与其他入站通道适配器一起使用的 Poller 配置事务管理器的方式。
下面的 XML 示例配置了一个事务管理器,该事务管理器使用带有入站通道适配器的 Poller :INSERT
UPDATE
DELETE
<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>
但是,在使用出站通道适配器或网关时,您可能需要专门启动事务。
如果 a 是出站适配器或网关的 input 通道,并且事务在当前执行线程中处于活动状态,则 JPA 操作将在同一事务上下文中执行。
您还可以将此 JPA 操作配置为作为新事务运行,如下例所示:DirectChannel
<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 元素指定了事务属性。
如果您有适配器的 input 通道,并且您希望适配器在与调用者相同的事务上下文中执行操作,则可以选择定义此子元素。
但是,如果使用 ,则必须具有该元素,因为调用客户端的事务上下文不会传播。DirectChannel
ExecutorChannel
transactional
与在 Spring 集成的名称空间中定义的 poller 元素不同,出站网关或适配器的元素是在 JPA 名称空间中定义的。transactional transactional |
与在 Spring 集成的名称空间中定义的 poller 元素不同,出站网关或适配器的元素是在 JPA 名称空间中定义的。transactional transactional |