领先一步
VMware 提供培训和认证,以加快您的进度。
了解更多这是博客文章系列的第三部分,重点介绍了最近发布的候选版本 1之后,Spring Integration 2.2中提供的一些新功能。第一部分描述了新的MongoDB适配器集。第二部分重点介绍了对使用事务同步非事务资源的扩展支持。
在今天的第三部分中,我们想介绍从Spring Integration 2.2开始提供的新的Java 持久性 API (JPA) 支持。JPA 模块与持久性提供程序无关,并且已使用以下程序进行了测试:
作为新的 JPA 模块的一部分,我们提供了一些组件来检索和持久化 JPA 实体对象:提供的示例使用嵌入式H2 数据库,其中包含一个名为PEOPLE的表。此表映射到包org.springframework.integration.samples.jpa中的Person实体类。通过此设置,我们涵盖了两个简单的用例:
$ git clone https://github.com/SpringSource/spring-integration-samples.git
接下来,转到 JPA 示例目录
$ cd spring-integration-samples/basic/jpa
现在,我们可以通过执行以下Maven命令来构建和运行应用程序:
$ mvn clean package exec:exec
最终应用程序启动,您应该会看到以下屏幕:
=========================================================
Welcome to the Spring Integration JPA Sample!
For more information please visit:
http://www.springintegration.org/
=========================================================
Please enter a choice and press enter:
1. Use Hibernate
2. Use OpenJPA
3. Use EclipseLink
q. Quit the application
Enter you choice:
JPA 示例允许您使用以下持久性提供程序之一来执行 JPA 操作:Hibernate、OpenJPA 或 EclipseLink。因此,在应用程序启动时,您将能够选择所需的持久性提供程序。选择后,您可以选择要执行的特定 JPA 操作。
Please enter a choice and press enter:
1. List all people
2. Create a new person
q. Quit the application
Enter you choice:
您可以列出PEOPLE表中的每个Person (选项 1)
Enter you choice: 1
ID NAME CREATED
==================================
1001, Cartman, 2012-10-04 16:14:02
==================================
或者您可以创建一个新的Person (选项 2)
Enter the Person's name:Demo User
Created person record with id: 1002
Do you want to create another person? (y/n)
...
/src/main/resources/META-INF/spring/integration/commonJpa-context.xml
此文件不包含任何 Spring Integration 特定的内容。我们所做的只是设置嵌入式数据库、相应的 DataSource、EntityManagerFactory 和事务管理器。
JPA 持久性提供程序特定的配置位于:
/src/main/resources/META-INF/spring/integration/eclipselink-context.xml
/src/main/resources/META-INF/spring/integration/hibernate-context.xml
/src/main/resources/META-INF/spring/integration/openjpa-context.xml
正如您将看到的,这些配置非常轻量级,只包含持久性提供程序特定的JpaVendorAdapter bean 声明。
所有 Spring Integration 特定的内容都在以下文件中配置:
/src/main/resources/META-INF/spring/integration/spring-integration-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:int="http://www.springframework.org/schema/integration"
xmlns:int-jpa="http://www.springframework.org/schema/integration/jpa"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/integration/jpa http://www.springframework.org/schema/integration/jpa/spring-integration-jpa.xsd">
<int:channel id="createPersonRequestChannel"/>
<int:channel id="listPeopleRequestChannel"/>
<int:gateway id="personService"
service-interface="org.springframework.integration.samples.jpa.service.PersonService"
default-request-timeout="5000" default-reply-timeout="5000">
<int:method name="createPerson" request-channel="createPersonRequestChannel"/>
<int:method name="findPeople" request-channel="listPeopleRequestChannel"/>
</int:gateway>
<int-jpa:retrieving-outbound-gateway entity-manager-factory="entityManagerFactory"
request-channel="listPeopleRequestChannel"
jpa-query="select p from Person p order by p.name asc">
</int-jpa:retrieving-outbound-gateway>
<int-jpa:updating-outbound-gateway entity-manager-factory="entityManagerFactory"
request-channel="createPersonRequestChannel" >
<int-jpa:transactional transaction-manager="transactionManager" />
</int-jpa:updating-outbound-gateway>
<!-- Depending on the selected profile, users can use different JPA Providers -->
<beans profile="default, hibernate">
<import resource="classpath:/META-INF/spring/integration/hibernate-context.xml"/>
</beans>
<beans profile="openjpa">
<import resource="classpath:/META-INF/spring/integration/openjpa-context.xml"/>
</beans>
<beans profile="eclipselink">
<import resource="classpath:/META-INF/spring/integration/eclipselink-context.xml"/>
</beans>
</beans>
检索出站网关和更新出站网关都使用EntityManagerFactory引用进行连接。或者,我们还提供了一种方法可以直接传入对EntityManager的引用。
检索出站网关还配置了一个 JPQL 查询,以按名称顺序检索数据库中的所有人员。另一方面,更新出站网关根本没有指定任何查询。它直接使用作为 Spring Integration 消息有效负载传入的Person对象。最终,Person对象被传递给EntityManager并持久化到数据库。此外,更新出站网关被声明为事务性的,确保 JPA 会话被刷新并将数据提交到数据库。
<int-jpa:parameter/>
子元素。例如,您可以通过指定命名参数来提供:
<int-jpa:parameter name="myNamedParam" type="java.lang.String" value="myParamValue"/>
或者,您也可以通过省略 name 属性来提供位置参数:
<int-jpa:parameter type="java.lang.String" value="myFirstParam"/>
<int-jpa:parameter type="java.lang.Integer" value="2"/>
最后,如果您使用的是出站通道适配器或任何出站网关,您还可以使用Spring 表达式语言 (SpEL)提供动态参数,让您可以轻松访问消息有效负载或其消息标头中的值。
<int-jpa:parameter expression="payload.name" name="firstName"/>