转载 在Java EE 环境下开发部署OpenJPA 应用
融入 Java EE
OpenJPA 是标准的 JPA 框架,因此它能够被任何的 EJB3.0 容器所集成,作为 JPA 的一种实现。比如我们可以将 JBoss 应用服务器中的 JPA 实现框架由系统默认的 Hibernate 切换成 OpenJPA,同样,我们可以将 Websphere、WebLogic 等的 JPA 实现框架由系统默认的框架切换成 OpenJPA。
要将 OpenJPA 容器 Java EE 容器,和 OpenJPA 作为独立框架运行时相比需要完成几部分的转换:
部署形式变为 EJB Jar 或者 EAR;OpenJPA 应用在 Java EE 环境下部署形式是 EJB Jar 或者 EAR,而不再是独立的 Java 应用或者 Servlet 容器中的 Web 应用。
使用系统级 JDBC 数据源,将事务处理委托给 JTA 事务;
在前面几篇文章中,我们开发 OpenJPA 应用时都是在 OpenJPA 配置文件 persistence.xml 文件中直接提供访问数据库的 JDBC 配置,操作实体的时候,我们也需要处理使用 entityManager.getTransaction().begin()、entityManager.getTransaction().commit() 这样的语句显示的处理事务。
在 Java EE 环境下,JDBC 通常都是由容器管理,JDBC 访问时的事务也通常使用容器管理,这样可以获得更大的灵活性,也能够最大化的利用容器的特性让企业应用更加强壮。要将 OpenJPA 容器 Java EE 容器,我们首要的任务就是将 OpenJPA 中的应用级 JDBC 数据源切换到 Java EE 容器的 JDBC 数据源上,另外还需要将事务处理委托给 Java EE 容器提供的 JTA 事务,而不在使用 entityManager.getTransaction().begin()、entityManager.getTransaction().commit() 这样的语句显示的处理事务。
注入 Entity Manager Factory 或者 Entity Manager
在前面几篇文章中,我们开发 OpenJPA 应用中操纵实体之前,都需要通过 Persistence 的 createEntityManagerFactory 方法创建 EntityManagerFactory 对象,然后创建 EntityManager 对象后操作实体。
但是根据 EJB3.0 规范中 JPA 部分的要求,在 Java EE 容器中的 JPA 应用应该通过依赖注入获取 Entity Manager Factory 或者是 EntityManager,也可以选择将 Entity Manager Factory 或者是 EntityManager 绑定到 JNDI,在代码中通过 JNDI 获取,而不是采用 Persistence 的 createEntityManagerFactory 方法来创建。
要将 OpenJPA 应用切换到 Java EE 环境下,我们需要向 OpenJPA 中注入 Entity Manager Factory 或者是 EntityManager 对象,或者是将 Entity Manager Factory 或者是 EntityManager 绑定到 JNDI,这取决于 Java EE 容器的支持方式和开发者的爱好。除此之外,OpenJPA 应用中对应部分的代码也需要修改,以适应 Java EE 容器端发生的变化。
使用会话 Bean 封装 EntityBean 的访问
在前面几篇文章中,OpenJPA 应用中生成的实体在客户端直接使用 Java 代码调用,然而在 Java EE 容器中的实体肯定是无法被客户端代码直接访问的,而且,根据 EJB3.0 规范的描述,Java EE 容器中的实体无法和 EJB2.1 中的实体一样绑定到 JNDI,因此我们的选择只能是使用会话 Bean 来封装 EntityBean 的访问。
OpenJPA 应用开发
在上一章中,我们了解了如何将 OpenJPA 应用移植到 Java EE 容器时需要完成的工作内容,本章中,我们将通过一个简单的例子来学习如何在 Java EE 容器中开发、部署一个 OpenJPA 应用。
Java EE 环境下,应用 OpenJPA 框架开发 EJB3.0 应用的主要步骤如下:
创建 EJB 应用目录;
在 Java EE 容器中配置 JDBC 数据源;
编写 ( 修改 ) 配置文件;
Java EE 容器通过 EJB jar 中的 META-INF\persistence.xml 文件来创建 EntityManagerFactory,然后在需要的时候将 EntityManagerFactory 对象或者它创建的 EntityManager 对象注入 OpenJPA 容器中。
根据业务需要设计 Java 对象、编写对应的 Java 实体类;
用 JDK 编译 Java 实体类;
用 OpenJPA 提供的工具—PCEnhancer--enhance 编译好的 Java 实体类;
被 enhance 过的类可以提供更好的运行性能、灵活的”懒加载”等方面的优势,更多详细的内容请参考 OpenJPA 的帮助文档。
使用 OpenJPA 提供的工具 MappingTool 从 Java 对象生成数据库定义文件 (DDL);
可以通过 MappingTool 工具直接保持 Entity 和数据库之间的一致性,也可以使用 MappingTool 工具生成的数据库定义文件 (DDL) 创建应用正常运行所需要的数据库结构。
将创建的实体类注册到 OpenJPA 容器中;
应用会话 Bean 封装对实体类的访问;
客户端通过会话 Bean 的访问,达到访问实体的目标。
我们将使用本系列文章的 第 2 部分:第一个 OpenJPA 应用 中使用过的简单例子,我们将创建名为 Animal 的实体,它有两个属性,分别是 id 和 name,Animal 对象将被持久化到本地的 MySQL 数据库中,其中 id 属性对应的数据库字段由 MySQL 数据库自动生成。
演示开发环境说明
下面的演示步骤说明均基于 Windows XP 平台,JDK 版本为 1.5.0_11,数据库服务器为 MySQL5.0,和演示代码位于同一台机器上。所有演示用例对应的 MySQL 数据库为”openjpa”,访问 MySQL 的用户名和密码也均为”openjpa”。
Java EE 容器使用 JBoss 应用服务器 4.2GA 或者版本,默认安装在 C:\jboss-4.2.0.GA 目录下。
Java EE 环境下 OpenJPA 应用开发典型步骤
请读者注意,后面章节中关于操作的说明均基于 Windows XP 操作系统,如果您使用的开发环境运行在其它类型的操作系统之上,请根据实际情况做出相应的调整。
建立工程目录
在 C: 盘根目下创建名为 ejb3demo 的目录,它包括名为 src 的目录,然后在 src 目录下创建合适的文件和目录。ejb3demo\src 目录是标准的 ejb 目录,我们所有的类文件和配置文件都将放在这个目录下。
创建好的 ejb3demo 目录中应该包括如下目录和文件:
ejb3demo
--src
--META-INF
persistence.xml
配置 JDBC 数据源
在 JBoss 应用服务器中配置 JDBC 数据源比较容易,我们只需要将 MySQL 数据库的 JDBC 驱动 jar 文件拷贝到 %JBOSS_HOME%\server\default\lib 目录下,然后在 %JBOSS_HOME%\server\default\deploy 目录下创建新的 mysql-ds.xml 文件,mysql-ds.xml 文件的内容如下:
1. <?xml version="1.0" encoding="UTF-8"?>
2. <datasources>
3. <local-tx-datasource>
4.