技术开发 频道

开发第一个 Open JPA 应用

  【IT168 技术文章】JPA 是 EJB 3.0 新引入的数据持久化编程模型。JPA 充分利用了注释(Annotation)和对象/关系映射,为数据持久化提供了更简单、易用的编程方式。OpenJPA 是 Apache 组织提供的 JPA 标准实现。本文描述了如何采用 OpenJPA 提供的接口开发 EJB 3.0 应用的步骤和方法,并介绍了 OpenJPA 中提供的几个小工具的用法,这些工具能让我们的开发过程变得更加简单、快速。

  下载及安装 OpenJPA

  支持环境准备

  由于 OpenJPA 是基于注释机制的框架,这需要用到 JDK 5.0 或者以上版本,因此请确保在工作机器上已经下载和安装了 JDK 5.0。

  演示过程中,我们需要一个数据库作为对象持久化的目标数据库。出于简单和方便的考虑,我们选择采用 MySQL 数据库,因此您需要下载 MySQL 数据库安装包。如果需要 MySQL 很好的支持中文字符(GB2312 编码),您可选择下载 MySQL 5.0 或者以上版本,安装的时候选择数据库字符集为 GB2312 即可。

  下载、安装 OpenJPA

  OpenJPA 的最新稳定版本是 Open JPA 0.97。OpenJPA 的安装比较简单,只需要将下载的压缩文件解压即可。我们假设将下载的压缩包解压到 C:/OpenJPA 目录下(本文后面将使用 %OPENJPA_HOME% 来引用这个目录)。

  使用 OpenJPA 开发 EJB 3.0 应用

  成功安装 OpenJPA 后,我们就可以开始应用 OpenJPA 框架开发 EJB 3.0 应用了。下面的章节中我们将讲述应用 OpenJPA 框架开发 EJB 3.0 应用的主要步骤。为了把描述集中在 OpenJPA 本身而不涉及太多的其它内容,在本演示场景中,我们在轻量级应用中来使用 OpenJPA,开发出的应用基于 Java SE 环境运行,而不依赖于 EJB 容器,关于如何在 Java EE 中配置使用 OpenJPA 将是另外一个主题,本文将暂不涉及,本系列的后续文章中将会讨论这个主题。

  通常情况下,使用 OpenJPA 框架开发持久层主要有以下步骤:

  编写(或修改)OpenJPA 配置文件;

  在非 JavaEE 环境下,OpenJPA 通常使用 CLASSPATH 环境下的 META-INF\persistence.xml 文件来创建 EntityManagerFactory,而每一个被管理的 Java 实体类必须在 persistence.xml 中注册后才能被 EneityManager 处理。

  根据业务需要设计 Java 对象、编写对应的 Java 实体类;

  用 JDK 编译 Java 实体类;

  用 OpenJPA 提供的工具 — PCEnhancer 来增强(enhance)编译好的 Java 实体类;被增强过的类可以提供更好的运行性能、灵活的 "懒加载" 等方面的优势,更多详细的内容请参考 OpenJPA 的帮助文档。

  使用 OpenJPA 提供的工具 MappingTool 从 Java 对象生成数据库定义文件(DDL);

  可以通过 MappingTool 工具直接保持 Entity 和数据库之间的一致性,也可以使用 MappingTool 工具生成的数据库定义文件(DDL)创建应用正常运行所需要的数据库结构。

  将创建的实体类注册到 OpenJPA 容器中;

  应用 JPA 接口编写实体类访问代码,实现相应的业务逻辑。

  下面我们将用一个简单的例子来说明创建 OpenJPA 应用的典型步骤,实例中我们将创建名为 Animal 的持久化对象,它有两个属性,分别是 “id”和 “name”,Animal 对象将被持久化到本地的 MySQL 数据库中,其中 id 属性对应的数据库字段由 MySQL 数据库自动生成。

  开发环境说明

  本文的演示说明均基于 Windows XP 平台,JDK 版本为 1.5.0_11,数据库服务器为 MySQL 5.0,和演示代码位于同一台机器上。所有演示用例对应的 MySQL 数据库为“openjpa”,访问 MySQL 的用户名和密码也均为“openjpa”。

  OpenJPA 应用开发典型步骤

  请读者注意,后面章节中关于操作的说明均基于 Windows XP 操作系统,如果您使用的开发环境运行在其它类型的操作系统之上,请根据实际情况做出相应的调整。

  建立工程目录

  在 C: 盘根目下创建名为 OpenJPAExamples 的目录,我们所有的类文件和配置文件都将放在这个目录下。

  编写 JPA 配置文件

  在 C:\OpenJPAExamples 新建 META-INF 目录,随后在该目录下创建 persistence.xml 文件。persistence.xml 是 OpenJPA 的配置文件,提供 OpenJPA 容器初始化、运行所需要的配置信息。比如 OpenJPA 的事务策略、数据库的连接信息等。清单 1 中是我们演示实例中所使用的 persistence.xml 文件的内容。

  清单 1 META-INF\persistence.xml

1.    <?xml version="1.0" encoding="UTF-8"?>
2.    
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
3.        xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
4.        version
="1.0">
5.        
<!—persistence-unit的name属性提供了创建EntityManagerFacotry时的
6.            关键字,transaction-type则指定了使用的事务管理类型,这里使
7.            用‘RESOURCE_LOCAL’参数表示使用本地事务 ?
8.        <persistence-unit name="mysql" transaction-type="RESOURCE_LOCAL"
>
9.            
<!—JPA的提供类,OpenJPA的设置如下,如果使用其它的JPA实现,这里
10.                的内容需要修改成相应的提供类 ?
11.            <provider
>
12.                org.apache.openjpa.persistence.PersistenceProviderImpl
13.            
</provider>
14.            
15.            
<!—OpenJPA容器中管理的实体类列表 ?
16.            <class
>org.vivianj.openjpa.entity.Animal</class>
17.            
<!—OpenJPA容器访问数据库的参数 ?
18.            <properties
>
19.                
<property name="openjpa.ConnectionURL"
20.                    value
="jdbc:mysql://localhost/openjpa"/>
21.                
<property name="openjpa.ConnectionDriverName"
22.                    value
="com.mysql.jdbc.Driver"/>
23.                
<property name="openjpa.ConnectionUserName"
24.                    value
="openjpa"/>
25.                
<property name="openjpa.ConnectionPassword"
26.                    value
="openjpa"/>
27.            
</properties>
28.        
</persistence-unit>
29.    
</persistence>

        创建实体类  

新创建实体类 Animal,为了说明的简单,该类只有两个属性:id 和 name,其中 id 字段代表的是编号(编号由 MySQL 数据库自动生成),name 属性表示名称。实体类的全部代码见清单 2,请注意其中的黑体部分,它们是 JPA 中定义的注释(Annotation),Animal 中仅仅用到了非常少的几个注释,了解其它更多注释的细节请参看 OpenJPA 的帮助文档。

  清单 2 Animal.java

1.    package org.vivianj.openjpa.entity;
2.    
3.    import javax.persistence.Basic;
4.    import javax.persistence.Entity;
5.    import javax.persistence.GeneratedValue;
6.    import javax.persistence.GenerationType;
7.    import javax.persistence.Id;
8.    
9.    /*
10.    *  使用Entity注释表示该类是实体类,它的name属性是该实体在查询中对应的
11.    *  唯一名称,如果没有提供Entity的name属性,默认的name属性是类名。
12.    
*/
13.    @Entity
14.    public class Animal {
15.        // 编号
16.        /* 使用Id注释表示该字段是标识字段 */
17.        @Id
18.        /*
19.         *  使用GeneratedValue注释定义该标识字段的产生方式,我们的演示系统中
20.         *  id由MySQL数据库字段自动生成,因此选择GenerationType.IDENTITY,
21.         *  另外的可选方式包括GeneratorType.AUTO,GenerationType.SEQUENCE,
22.         *  GenerationType.TABLE。
23.        
*/
24.        @GeneratedValue(strategy = GenerationType.IDENTITY)
25.        private int id;
26.    
27.        // 名称
28.        /*
29.         *  Basic注释表示该属性是持久化属性,没有使用Basic注释的属性将不会
30.         *  被持久化到数据库中
31.        
*/
32.          @Basic
33.        private String name;
34.        
35.        public int getId() {
36.            return id;
37.        }
38.    
39.        public void setId(int id) {
40.            this.id = id;
41.        }
42.    
43.        public String getName() {
44.            return name;
45.        }
46.    
47.        public void setName(String name) {
48.            this.name = name;
49.        }
50.    
51.    }
0
相关文章