Spring Integration 2.2 新特性 (第三部分 - JPA 支持)

工程 | Gunnar Hillert | 2012年10月5日 | ...

这是博客文章系列的第三部分,重点介绍了最近发布的候选版本 1之后,Spring Integration 2.2中提供的一些新功能。第一部分描述了新的MongoDB适配器集。第二部分重点介绍了对使用事务同步非事务资源的扩展支持。

在今天的第三部分中,我们想介绍从Spring Integration 2.2开始提供的新的Java 持久性 API (JPA) 支持。JPA 模块与持久性提供程序无关,并且已使用以下程序进行了测试:

作为新的 JPA 模块的一部分,我们提供了一些组件来检索和持久化 JPA 实体对象:
  • JPA 入站通道适配器
  • JPA 出站通道适配器
  • JPA 更新出站网关
  • JPA 检索出站网关
使用这些组件,您可以选择、创建、更新和删除数据库中的实体。除了直接使用实体类持久化数据外,您还可以使用Java 持久性查询语言 (JPQL)以及使用原生 SQL 查询来执行查询。此外,还支持命名查询。

JPA 示例

在我们的Spring Integration 示例存储库中,我们提供了一个示例应用程序演示了 JPA 支持,我们想在本博客文章中使用它来向您展示如何轻松上手。

提供的示例使用嵌入式H2 数据库,其中包含一个名为PEOPLE的表。此表映射到包org.springframework.integration.samples.jpa中的Person实体类。通过此设置,我们涵盖了两个简单的用例:

  • 列出数据库中的所有人员
  • 在数据库中创建一个新的 Person 记录
相应的 Spring Integration 流程也非常简单。该流程通过消息网关启动。这使我们可以隐藏 Spring Integration 消息传递 API,并且只向示例的Main类 (org.springframework.integration.samples.jpa.Main)公开一个普通的 Java 接口 (PersonService)。根据在PersonService上调用的方法,Spring Integration 消息将被路由到JPA 检索出站网关 (列出所有人员)或JPA 更新出站网关 (创建一个新人员)。

运行示例

为了设置示例,请使用Git检出Spring Integration 示例存储库

    $ 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)
...

配置细节

JPA 示例使用多个 Spring XML 应用程序上下文文件进行配置。在大多数情况下,Spring Integration 的 JPA 支持使用核心 Spring 框架提供的 JPA 支持。因此,常见的 JPA 配置位于:

/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 会话被刷新并将数据提交到数据库。

提供参数

上例中未显示,但使用 JPA 支持组件,您还可以为 JPQL/SQL 查询提供参数。为此,您可以使用

<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"/>

结论

我们希望这篇博文能为您提供关于新的 Spring Integration JPA 支持的有用概述。有关更详细的信息,请参阅 Spring Integration 参考手册中标题为JPA 支持的章节。最后,如果您遇到任何问题或有任何其他问题,请随时发布到我们的Spring Integration 论坛

资源

获取 Spring 时事通讯

通过 Spring 时事通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加快您的进度。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部