MyEclipse6Java开发中文教程 第十三章开发JPA应用 第十三章开发JPA应用 131介绍 1311JPA简介 312 MyEclipse提供的JPA开发功能 13.13JPA的代码结构和相关理论知识 1313.1JPA代码结构 13.1.32配置文件 persistence. xml 12244446 13133实体类及标注 13134使用 EntityManager来管理实体 13 13135 Query对象 13136JPA查询语言( JPA QL)简介 13.137回调方法 132准备工作 133创建 JPAHello项目 13.3.1创建表格 1332创建 HelloJPA Java Project 1333添加 JPA Capabilities到现有项目. 1334使用JPA配置文件编辑器修改文件 23358 133.5使用反向工程快速生成JPA实体类和DAO 13.36调整生成的实体类标注 1337编写测试代码 134JPA工具高级部分 134.1 MyEclipse Java Persistence Perspective透视图…… 1342 JPA Details视图 1343JPA代码编辑辅助 1344生成一对多等复杂映射代码 13.5 Spring整合JPA开发… 58 13.51添加 Spring开发功能 1352从数据库反向工程生成实体和 Spring D 1353编写并运行测试代码 13531支持标注事务时的调试代码 13532不支持标注事务时的调试代码 7777 136小结 137参考资料 刘长炯著
MyEclipse 6 Java 开发中文教程 1 刘长炯著 第十三章 开发 JPA 应用 第十三章 开发JPA应用 ..................................................................................................... 1 13.1 介绍................................................................................................................... 2 13.1.1 JPA 简介.................................................................................................. 2 13.1.2 MyEclipse提供的JPA开发功能 ................................................................. 4 13.1.3 JPA的代码结构和相关理论知识................................................................ 4 13.1.3.1 JPA代码结构.................................................................................. 4 13.1.3.2 配置文件persistence.xml............................................................... 4 13.1.3.3 实体类及标注 ................................................................................ 6 13.1.3.4 使用EntityManager来管理实体.................................................... 13 13.1.3.5 Query对象.................................................................................... 18 13.1.3.6 JPA 查询语言(JPA QL)简介 .................................................... 19 13.1.3.7 回调方法 ..................................................................................... 21 13.2 准备工作.......................................................................................................... 22 13.3 创建JPAHello项目 ............................................................................................ 22 13.3.1 创建表格................................................................................................. 22 13.3.2 创建 HelloJPA Java Project ................................................................... 23 13.3.3 添加 JPA Capabilities 到现有项目......................................................... 23 13.3.4 使用JPA配置文件编辑器修改文件 ......................................................... 25 13.3.5 使用反向工程快速生成JPA实体类和DAO.............................................. 28 13.3.6 调整生成的实体类标注 .......................................................................... 42 13.3.7 编写测试代码 ........................................................................................ 43 13.4 JPA 工具高级部分............................................................................................ 46 13.4.1 MyEclipse Java Persistence Perspective透视图.................................... 46 13.4.2 JPA Details 视图.................................................................................... 47 13.4.3 JPA 代码编辑辅助 ................................................................................. 49 13.4.4 生成一对多等复杂映射代码................................................................... 49 13.5 Spring整合JPA开发.......................................................................................... 58 13.5.1 添加Spring开发功能 .............................................................................. 59 13.5.2 从数据库反向工程生成实体和Spring DAO............................................. 60 13.5.3 编写并运行测试代码.............................................................................. 71 13.5.3.1 支持标注事务时的调试代码......................................................... 71 13.5.3.2 不支持标注事务时的调试代码 ..................................................... 73 13.6 小结................................................................................................................. 74 13.7 参考资料.......................................................................................................... 75
MyEclipse6Java开发中文教程 在本章我们将会介绍JPA的开发,一共包括三部分内容:独立运行的JPA应用开发 Spring整合JPA开发;EJB査询语言开发。其实关于JPA还有一部分是基于EJB容器环境 的开发,那一部分内容我们将会放到后面的EJB开发一章来介绍。由于 MyEclipse6对JPA 开发提供了很方便的支持,因此我们的内容主要就集中在如何使用 MyEclipse进行快速开发 这个话题上。 131介绍 1311JPA简介 前面我们已经介绍了 Hibernate,但是实际在开发中所存在的这种进行数据库开发的 ORM框架不止一种,包括JDO,Bats, TopLink,KODo, OpenJPA等等多种开源的和 商业的产品。那么这有什么问题呢?假设现在我们的项目是用 Hibernate开发的,运行于 Oracle数据库之上,然而上线运行一段时间后,发现有一些性能上的问题,而这时候我们 想找人来做技术支持,希望它来帮我们解决这些问题,因为开发人员并不是个个都能读懂 Hibernate的源码然后找到问题所在的。这是第一种可能:客户(通常是有钱的大客户)希 望能在遇到问题时有人提供商业的技术支持和顾问服务。第匚种可能: Oracle公司推出了 专用于对 Oracle数据库特别优化过的ORM产品,名为 TopLink,然而很不幸,虽然它能解 决我们的问题,但是,因为 Hibernate的类库的包结构和 TopLink的相差太远,一个是以 org. hibernate开头的,另一个却是以 com. oracle开头的,更要命的是,两者之间的类库根 本就没有相似之处!那我们的项目并不能通过简单的将代码的包换一下,就能迁移成功,下 载岂不是要所有涉及 Hibernate的地方都得重写!换句话说,当我们使用 Hibernate或者其 它ORM框架开发时,我们的代码已经被绑死了!虽然代码是和数据库无关的,然而数据库 访问的Java代码却是死死的和某种框架绑定在一起了 针对这种情况,即Java的ORM框架再次出现诸侯割据,烽烟混战的局面,而Java 程序员却被迫只能选择一种框架,而无法在项目开发之后变更框架的情况,Sun公司- Java和 Java ee规范的领导者,就像在当年JDBC规范出现之前所作的那样,在 Java ee 5的规范制定中,特地提出了JPA( Java Persistence AP)这一新的ORM规范,意图结束这 种混乱的局面,并革命性的使用标注作为开发模式,很大程度上减少了开发人员的负担:包 括背诵包和类的负担以及辛辛苦苦的编写XML配置文件来进行实体映射的负担,并使用 POJO的方式进行开发。和之前的JDBC一样,在充分吸收现有ORM框架的基础上,得到 了一个易于使用、伸缩性强的ORM规范,它不仅仅提供基础的映射功能,还使这些JPA 的框架提供者能够提供高级功能。Sun引入新的 JPA ORM规范出于两个原因:其一,简化 现有 Java ee和 Java se应用的对象持久化的开发工作;其二,Sun希望整合对ORM技 术,实现天下归 JPA由EJB30软件专家组开发( Hibernate的发明者 Gavin King老师也加入其中), 作为JSR220实现的一部分。但它不局限于EJB30,你可以在Web应用、甚至桌面应用 中使用。JPA的宗旨是为POJO提供持久化标准规范,由此可见,经过这几年的实践探索, 能够脱离容器独立运行,方便开发和测试的理念已经深入人心了。目前 Hibernate3(确切 说是配合 Hibernate Entity Manager)、 TopLink、KODO以及 OpenJPA都提供了JPA的实 现,甚至还包括一些以前的JDO产品。而截至目前,所有支持 Java ee5的服务器(需要 通过Sun的认证才行),都支持JPA规范,这些服务器包括: Apache Geronimo-21(开源 服务器), WebLogic Server v10.0(商业,BEA公司产品,现并入 Oracle), IBM WASCE 2 刘长炯著
MyEclipse 6 Java 开发中文教程 2 刘长炯著 在本章我们将会介绍 JPA 的开发,一共包括三部分内容:独立运行的 JPA 应用开发; Spring 整合 JPA 开发;EJB 查询语言开发。其实关于 JPA 还有一部分是基于 EJB 容器环境 的开发,那一部分内容我们将会放到后面的 EJB 开发一章来介绍。由于 MyEclipse 6 对 JPA 开发提供了很方便的支持,因此我们的内容主要就集中在如何使用 MyEclipse 进行快速开发 这个话题上。 13.1 介绍 13.1.1 JPA 简介 前面我们已经介绍了 Hibernate,但是实际在开发中所存在的这种进行数据库开发的 ORM 框架不止一种,包括 JDO,iBatis,TopLink,KODO,OpenJPA 等等多种开源的和 商业的产品。那么这有什么问题呢?假设现在我们的项目是用 Hibernate 开发的,运行于 Oracle 数据库之上,然而上线运行一段时间后,发现有一些性能上的问题,而这时候我们 想找人来做技术支持,希望它来帮我们解决这些问题,因为开发人员并不是个个都能读懂 Hibernate 的源码然后找到问题所在的。这是第一种可能:客户(通常是有钱的大客户)希 望能在遇到问题时有人提供商业的技术支持和顾问服务。第二种可能:Oracle 公司推出了 专用于对 Oracle 数据库特别优化过的 ORM 产品,名为 TopLink,然而很不幸,虽然它能解 决我们的问题,但是,因为 Hibernate 的类库的包结构和 TopLink 的相差太远,一个是以 org.hibernate 开头的,另一个却是以 com.oracle 开头的,更要命的是,两者之间的类库根 本就没有相似之处!那我们的项目并不能通过简单的将代码的包换一下,就能迁移成功,下 载岂不是要所有涉及 Hibernate 的地方都得重写!换句话说,当我们使用 Hibernate 或者其 它 ORM 框架开发时,我们的代码已经被绑死了!虽然代码是和数据库无关的,然而数据库 访问的 Java 代码却是死死的和某种框架绑定在一起了。 针对这种情况,即 Java 的 ORM 框架再次出现诸侯割据,烽烟混战的局面,而 Java 程序员却被迫只能选择一种框架,而无法在项目开发之后变更框架的情况,Sun 公司―― Java 和 Java EE 规范的领导者,就像在当年 JDBC 规范出现之前所作的那样,在 Java EE 5 的规范制定中,特地提出了 JPA(Java Persistence API)这一新的 ORM 规范,意图结束这 种混乱的局面,并革命性的使用标注作为开发模式,很大程度上减少了开发人员的负担:包 括背诵包和类的负担以及辛辛苦苦的编写 XML 配置文件来进行实体映射的负担,并使用 POJO 的方式进行开发。和之前的 JDBC 一样,在充分吸收现有 ORM 框架的基础上,得到 了一个易于使用、伸缩性强的 ORM 规范,它不仅仅提供基础的映射功能,还使这些 JPA 的框架提供者能够提供高级功能。Sun 引入新的 JPA ORM 规范出于两个原因:其一,简化 现有 Java EE 和 Java SE 应用的对象持久化的开发工作;其二,Sun 希望整合对 ORM 技 术,实现天下归一。 JPA 由 EJB 3.0 软件专家组开发(Hibernate 的发明者 Gavin King 老师也加入其中), 作为 JSR-220 实现的一部分。但它不局限于 EJB 3.0,你可以在 Web 应用、甚至桌面应用 中使用。JPA 的宗旨是为 POJO 提供持久化标准规范,由此可见,经过这几年的实践探索, 能够脱离容器独立运行,方便开发和测试的理念已经深入人心了。目前 Hibernate 3(确切 说是配合 Hibernate Entity Manager)、TopLink、KODO 以及 OpenJPA 都提供了 JPA 的实 现,甚至还包括一些以前的 JDO 产品。而截至目前,所有支持 Java EE 5 的服务器(需要 通过 Sun 的认证才行),都支持 JPA 规范,这些服务器包括:Apache Geronimo-2.1(开源 服务器), WebLogic Server v10.0(商业,BEA 公司产品,现并入 Oracle),IBM WASCE
MyEclipse6Jaa开发中文教程 20(商业服务器), Apusic Application Server(v50)(国产,金蝶中间件,商业), Oracle Application Server11(商业), SAP NetWeaver7.1(商业), Sun Java System Application erver Platform Edition9(商业,单免费使用), Tmax Soft JEUS6(不详), GlassFish Application Server(开源软件)。在这里提一下 JBoss,最新的4和5都支持JPA,然而, 它却没通过 Java ee5的认证,它的JPA是基于 Hibernate实现的,因为 Hibernate的作者 现在加入了 JBoss公司(确切的说是 Redhat公司,它收购了 JBoss)。 JPA的总体思想和现有 Hibernate、 TopLink,JDO等ORM框架大体一致。总的来说 JPA包括以下3方面的技术: ●ORM映射元数据,JPA支持XML和JDK5.0注解两种元数据的形式,元数据描述对 象和表之间的映射关系,框架据此将实体对象持久化到数据库表中; ●JPA的AP,用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事 情,开发者从繁琐的JDBC和SQL代码中解脱出来。 查询语言,这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询 语言查询数据,避免程序的SQL语句紧密耦合, 最后,需要说明的是,JPA只是一个规范,就好像规定所有的手机都必须能打电话一样, 但是,JPA本身不是电话,我们能说手机提供了通话功能,但是我们不能说通话功能就是 个手机。很显然手机提供了通话功能之外的其它很多附加的能力,同样的,JPA的实现者也 可以根据自己的情况,提供基本功能之外的附加功能。其系统结构图如图13.1所示。这样, 其实JPA一共分成了两部分,一部分就是JPA规范,它是套编程的接口(AP,供开发 人员来进行调用;另一部分就是JPA规范的实现者,一般情况下他们在现有ORM框架的 基础上,再编写一套基于JPA的实现类,当然这时候他们也会根据实际情况进行一些增强 的功能。我们程序员,则处于JPA规范之般来说不需要特别的熟悉底层ORM的详 细信息,当然如果能有所了解就更好了。ORM框架则生成SQL语句,调用JDBC,通过 JDBC再去操作最终的数据库。 JPA规范 程序员的实体类和DAO ORM框架+JPA实现类+增强 业务层和表示层 JDBC 数据库 图13.1JPA的系统结构图 目前支持JPA的开发工具(DE)是比较多的,包括 MyEclipse6, Eclipse IDE for Java EE Developers(最新的33)版本, Netbeans556, BEA Workshop10, Oracle JDeveloper 等等,其中不乏一些免费的选择。其中支持最标准的当属免费的 Netbeans6了,不光能生 成JPA代码,还能附带生成增删改查的JSF页面,以及支持最新的Swng桌面应用框架, 支持Swng应用中直接通过JPA修改底层数据。 刘长炯著
MyEclipse 6 Java 开发中文教程 3 刘长炯著 2.0(商业服务器),Apusic Application Server (v5.0)(国产,金蝶中间件,商业), Oracle Application Server 11 (商业),SAP NetWeaver 7.1(商业),Sun Java System Application Server Platform Edition 9(商业,单免费使用),TmaxSoft JEUS 6(不详),GlassFish Application Server(开源软件)。在这里提一下 JBoss,最新的 4 和 5 都支持 JPA,然而, 它却没通过 Java EE 5 的认证,它的 JPA 是基于 Hibernate 实现的,因为 Hibernate 的作者 现在加入了 JBoss 公司(确切的说是 RedHat 公司,它收购了 JBoss)。 JPA 的总体思想和现有 Hibernate、TopLink,JDO 等 ORM 框架大体一致。总的来说, JPA 包括以下 3 方面的技术: z ORM 映射元数据,JPA 支持 XML 和 JDK 5.0 注解两种元数据的形式,元数据描述对 象和表之间的映射关系,框架据此将实体对象持久化到数据库表中; z JPA 的 API,用来操作实体对象,执行 CRUD 操作,框架在后台替我们完成所有的事 情,开发者从繁琐的 JDBC 和 SQL 代码中解脱出来。 z 查询语言,这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询 语言查询数据,避免程序的 SQL 语句紧密耦合。 最后,需要说明的是,JPA 只是一个规范,就好像规定所有的手机都必须能打电话一样, 但是,JPA 本身不是电话,我们能说手机提供了通话功能,但是我们不能说通话功能就是一 个手机。很显然手机提供了通话功能之外的其它很多附加的能力,同样的,JPA 的实现者也 可以根据自己的情况,提供基本功能之外的附加功能。其系统结构图如图 13.1 所示。这样, 其实 JPA 一共分成了两部分,一部分就是 JPA 规范,它是一套编程的接口(API),供开发 人员来进行调用;另一部分就是 JPA 规范的实现者,一般情况下他们在现有 ORM 框架的 基础上,再编写一套基于 JPA 的实现类,当然这时候他们也会根据实际情况进行一些增强 的功能。我们程序员,则处于 JPA 规范之上,一般来说不需要特别的熟悉底层 ORM 的详 细信息,当然如果能有所了解就更好了。ORM 框架则生成 SQL 语句,调用 JDBC,通过 JDBC 再去操作最终的数据库。 图 13.1 JPA 的系统结构图 目前支持 JPA 的开发工具(IDE)是比较多的,包括 MyEclipse 6,Eclipse IDE for Java EE Developers(最新的 3.3)版本,Netbeans 5.5/6,BEA Workshop 10,Oracle JDeveloper 等等,其中不乏一些免费的选择。其中支持最标准的当属免费的 Netbeans 6 了,不光能生 成 JPA 代码,还能附带生成增删改查的 JSF 页面,以及支持最新的 Swing 桌面应用框架, 支持 Swing 应用中直接通过 JPA 修改底层数据
MyEclipse6Java开发中文教程 1312 My Eclipse提供的JPA开发功能 MyEclipse6对JPA的开发提供了全面的支持,包括:添加、修改JPA的实现类库的 功能;从数据库反向工程直接生成实体类和DAO的功能;增强的JPA实体信息编辑器;实 体标注编写自动提示功能;实体信息验证:内置 Spring+JPA整合向导和 Spring DAO代码 生成功能等等。 1313JPA的代码结构和相关理论知识 注意:本节内容读者可以放在做完练习之后再来阅读,或者是碰到不熟悉的写法时再来 阅读,会比较好一些。因为实际情况来说,每个框架都有成千上万的知识点,而对于开发人 员来说,一般掌握最常用的部分即可。当然也可以先阅读,后练习。本节内容相对多而且有 些,因为JPA的应用越来越广泛,而 My Eclipse6实际上是能够生成绝大多数的代码(甚 至包括一对多等映射关系),所以我们提供这些内容主要是处于帮助大家理解并修改代码的 目的。而JPA还支持纯ⅩML配置非标注的开发方式,因为比较少用我们就先不做介绍了。 13131JPA代码结构 由于 Hibernate自动生成的代码封装的比较厉害,可能不太便于初学者理解。由图13.1 我们可以看到,一个JPA的项目离不开途中所说的几个部分。首先当然是要有数据库服务 器了,其次,需要JDBC的驱动程序,接着,是JPA的实现类和JPA本身的包,最后,我 们才能开发JPA的应用 其源代码目录结构一般如下 OMETA-INF/D persistence.xml 目 Entity 1. java 自Ent! DAO. java 开发过程一般是:JPA配置文件声明持久化单元睁编写带标注的实体类睁编写DAO 131.32配置文件 persistence. xml 首先第一个,就是JPA的配置文件 persistence.xm,一般位于目录 META-INF下,注 意大小写不能写错了。这个文件的结构如图132所示 刘长炯著
MyEclipse 6 Java 开发中文教程 4 刘长炯著 13.1.2 MyEclipse 提供的 JPA 开发功能 MyEclipse 6 对 JPA 的开发提供了全面的支持,包括:添加、修改 JPA 的实现类库的 功能;从数据库反向工程直接生成实体类和 DAO 的功能;增强的 JPA 实体信息编辑器;实 体标注编写自动提示功能;实体信息验证;内置 Spring + JPA 整合向导和 Spring DAO 代码 生成功能等等。 13.1.3 JPA 的代码结构和相关理论知识 注意:本节内容读者可以放在做完练习之后再来阅读,或者是碰到不熟悉的写法时再来 阅读,会比较好一些。因为实际情况来说,每个框架都有成千上万的知识点,而对于开发人 员来说,一般掌握最常用的部分即可。当然也可以先阅读,后练习。本节内容相对多而且有 些,因为 JPA 的应用越来越广泛,而 MyEclipse 6 实际上是能够生成绝大多数的代码(甚 至包括一对多等映射关系),所以我们提供这些内容主要是处于帮助大家理解并修改代码的 目的。而 JPA 还支持纯 XML 配置非标注的开发方式,因为比较少用我们就先不做介绍了。 13.1.3.1 JPA 代码结构 由于 Hibernate 自动生成的代码封装的比较厉害,可能不太便于初学者理解。由图 13.1 我们可以看到,一个 JPA 的项目离不开途中所说的几个部分。首先当然是要有数据库服务 器了,其次,需要 JDBC 的驱动程序,接着,是 JPA 的实现类和 JPA 本身的包,最后,我 们才能开发 JPA 的应用。 其源代码目录结构一般如下: META-INF/ persistence.xml Entity1.java EntityDAO.java 开发过程一般是:JPA配置文件声明持久化单元 编写带标注的实体类 编写DAO 类。 13.1.3.2 配置文件 persistence.xml 首先第一个,就是 JPA 的配置文件 persistence.xml,一般位于目录 META-INF 下,注 意大小写不能写错了。这个文件的结构如图 13.2 所示
MyEclipse6Java开发中文教程 persistence. xml name="PU1" name="PU2 provider class class class property propert 图132 persistence. xm的结构图 我们列出一份示例的代码清单,如下所示 <?xm/ version="1.0"encoding=UTF-8?> xminsxsi="http://ww.w3.org/2001/xmlschema-instance Xsi.schemalocation="http./java.sun.com/xmi/ns/persistence httpava.sun.com/xm/ns/persistence/persistence10.xsd"version=1.0> spersistence-unit name= JPADemoPU ction-type=RESOURCE LOCAL oracle toplink essentials. PersistenceProvider <classsjpadao Myuser</class> <property name=toplink jdbc driver" value="com mysql jdbc Driver"p property name="toplink jdbc. url value=jdbc. mysq / /localhost: 3306/test?useUnicode=true&, characterEncoding= GBK" <property name="toplink jdbc. user"value=root"p </persistence-unit> /persistence> 这个文件的内容包括一个或者多个持久化单元( persistence unit)的定义,这是和 刘长炯著
MyEclipse 6 Java 开发中文教程 5 刘长炯著 图 13.2 persistence.xml 的结构图 我们列出一份示例的代码清单,如下所示: <?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <persistence-unit name="JPADemoPU" transaction-type="RESOURCE_LOCAL"> <provider> oracle.toplink.essentials.PersistenceProvider </provider> <class>jpadao.Myuser</class> <properties> <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver" /> <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding= GBK" /> <property name="toplink.jdbc.user" value="root" /> </properties> </persistence-unit> </persistence> 。 这个文件的内容包括一个或者多个持久化单元(persistence unit)的定义,这是和