Spring高级编程_旺旺老师.pdf

上传人:asd****56 文档编号:70322547 上传时间:2023-01-19 格式:PDF 页数:31 大小:2.02MB
返回 下载 相关 举报
Spring高级编程_旺旺老师.pdf_第1页
第1页 / 共31页
Spring高级编程_旺旺老师.pdf_第2页
第2页 / 共31页
点击查看更多>>
资源描述

《Spring高级编程_旺旺老师.pdf》由会员分享,可在线阅读,更多相关《Spring高级编程_旺旺老师.pdf(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、主题:刘红旺 JAVASE 教程 类和对象 旺旺老师旺旺老师软件工程师培训教程软件工程师培训教程 使用 JPA 完成持久化旺旺老师简介旺旺老师简介 刘红旺,82 年生于山西,02 年来西安求学,一年后辍学从事软件开发工作,三年后投身软件教育至今。至此,旺旺拥有七年工作经验,四年软件教育经验。旺旺兴趣广泛,近期一直学习经济学与心理学。旺旺老师课程特点:通俗易懂,风趣幽默。旺旺老师旺旺老师 版权所有版权所有 Uhttp:/U 主题:刘红旺 JAVASE 教程 类和对象 标题 图书说明(图书说明(JPAJPA)Hibernate、iBATIS、TopLink、Castor JDO、Apache OJ

2、B 等这么多持久层框架,你还在为学习上面那个框架而苦恼吗?你还为研究下一代是那个而头疼吗?朋友,学习 JPA 吧!JPA 的出现就是解决您上面的苦恼的。在这里我们向您郑重承诺:“学好 JPA,一切持久层框架尽收眼底;使用JPA,一切持久化层工作通通搞定”。还在等什么?那就快点吧!附录:旺旺的写书宣言大腕版。出书,书本厚度至少要一千页;封面要复古,最好弄副古代的山水画,千万不能出现计算机英文单词;名字什么火就用什么,比如爪哇那些事儿编程往事:爪哇风云 20 年爪哇升职计与爪哇同居的日子爪哇囧途等;序言一定要由名人代写,不是大公司大总裁就是大出版社大编辑,总之一定要“大”,你要是随便找一朋友写都不

3、好意思出版;内容要全,要广,上知天文,下知地理,把古代什么儒家啊道家啊法家啊墨家啊那些思想能加的全给他加上,读者一看,动不动就是孔子说老子说墨子说,倍有面子;问:那这样读者还能看懂吗?答:看不懂?那就对了。你要了解现在读者的心态,翻下能看得懂的书是作者没水平,看不懂的才是权威,所以我们写书的口号就是:不求易懂,但求最难。城市城市:陕西,西安陕西,西安 QQ:22713528 技术交流群:技术交流群:17951956 电子邮件电子邮件: 个人网站个人网站:http:/ 简单简单 IT 学习网,学习学习网,学习 IT 变简单变简单 说明:本说明:本教程教程配套视频会同期发配套视频会同期发布,欢迎大

4、家访问旺旺老师的布,欢迎大家访问旺旺老师的网网站站 http:/了解详情了解详情。主题:JPA 旺旺老师软件工程师培训教程 页面 3/31 WWW.EASYITEDU.COM 旺旺老师,版权所有 旺旺老师旺旺老师JPAJPA 课程教程课程教程.1 图书说明(图书说明(JPAJPA).2 第一章第一章:JPA:JPA 简介简介.3 1.11.1 持久化持久化,DAO,DAO 与与 ORMORM.4 1.1.11.1.1 持持久化久化.4 1.1.21.1.2 DAODAO.4 1.1.31.1.3 ORMORM.5 1.21.2 ORMORM 框架框架.6 1.31.3 JPAJPA 简介简介.

5、7 1.3.11.3.1 框架的遗憾框架的遗憾.7 1.3.21.3.2 JPAJPA 规范规范.7 1.3.2.1 JPA 是什么.7 1.3.2.2 JPA 规范包含内容.8 1.3.2.3 JPA 与 EJB 关系.8 1.3.2.4 JPA 在应用程序中的位置.9 1.41.4 JPAJPA 开发流程(开发流程(M MY YE ECLIPSE CLIPSE 8.6+M8.6+MY YSQLSQL).9 1.4.11.4.1 准备工作准备工作.9 1.4.21.4.2 添加添加 JPAJPA 支持支持.10 1.4.2.1 选择框架类型.10 1.4.2.2 持久化单元选择.11 1.4

6、.2.3 结果.12 1.4.31.4.3 添加添加 POJOPOJO 类类.13 1.4.3.1 MyEclipse 反转工具生成.13 1.4.3.2 映射类详解.15 1.4.3.3 JPA 主配置文件配置映射类.16 1.4.3.4 映射类状态.16 1.4.41.4.4 编写编写 JPAJPA 代码代码.17 1.4.4.1JPA 组件.18 1.4.4.2 实际代码.错误错误!未定义书签。未定义书签。1.4.31.4.3 编写单元测试,运编写单元测试,运行行.错误错误!未定义书签。未定义书签。版本.31 第一章:JPA 简介 主题:JPA 旺旺老师软件工程师培训教程 页面 4/31

7、 WWW.EASYITEDU.COM 旺旺老师,版权所有 本章首先给大家介绍持久化,DAO 与 ORM 三个概念,以及它们之间的关系;然后了解下几个 ORM 框架,以及学习使用它们存在的问题。下来我们介绍什么是 JPA 以及它的实现与优势。最后是 JPA 规范的详细讲解。1.11.1 持久化持久化,DAO,DAO 与与 ORMORM 介绍持久化,DAO 与 ORM 三个概念,以及它们之间的关系。1.1.11.1.1 持久化持久化 数据在计算机中有两种状态:瞬时状态瞬时状态:保存在内存的程序数据,程序退出后,数据就消失了,称为瞬时状态 持久状态持久状态:保存在磁盘上的程序数据,程序退出后依然存在

8、,称为程序数据的持久状态 持久化持久化:将程序数据在瞬时状态和持久状态之间相互相互转换转换的机制 图一:持久化 1.1.21.1.2 DAODAO DAO 的全称为Data Access Object(数据访问对象)。DAO 与持久化的关系是:DAO 一种程序数据访问层(持久化层)的设计思想。DAO 不仅仅是其中的 DAO 类,DAO 完整组件如下:DAO 工厂类(暂时不使用,使用工厂设计模式)DAO 接口(一个)实现了 DAO 接口的具体类(一个或多个)数据传输对象(dto,vo,POJO 类)图二:DAO 持久化持久化 主题:JPA 旺旺老师软件工程师培训教程 页面 5/31 WWW.EA

9、SYITEDU.COM 旺旺老师,版权所有 DAO 接口中声明常用的保存查询等方法,这样利用面向接口编程,业务逻辑层声明接口,提高程序的可扩展性。现在我们开发应用程序主要的数据源是数据库,但它还有可能是如 XML 文件,文本文件等这样的系统,不同的数据源存在不同的访问方式,即便是相同的数据源也存在不同的访问方式。DAO 实现类针对不同的数据源编写不同的实现(Impl),即便是相同的数据源,针对不同的访问方式也可以编写不同的实现。DAO 工厂类根据不同的数据源与访问特性生产对应的 DAO 产品,供业务逻辑类使用。值对象就是一个实体类,封装一条数据。1.1.31.1.3 ORMORM ORM 的全

10、称为 Object-Relational Mapping(对象关系映射)。ORM 与 DAO 的关系是:ORM 是 DAO 接口针对关系型数据库的一种实现,本质上就是一个DAO 实现类。现在我们开发的项目数据源大多为关系数据库,而在应用程序中表示数据的为某个实体类对象;利用程序我们把一个实体类的数据转化为关系型数据库表中的一行数据,或者把关系型数据库表中的一行数据转化为应用程序中的一个实体类,我们把:“完成完成应用程序应用程序对象数据对象数据到到关系型数据关系型数据映射的机制称为对象映射的机制称为对象-关系映射关系映射”图三:ORM 主题:JPA 旺旺老师软件工程师培训教程 页面 6/31 W

11、WW.EASYITEDU.COM 旺旺老师,版权所有 1.21.2 ORMORM 框架框架 我们可以自己编写 ORM 的实现,其实在使用 hibernate 前,只要你编写的程序中有实体类,那你的开发就可以理解为已经使用了 ORM 了。当然,自己编写各种实现使我们将大量的精力耗费在无止境繁琐的 DAO 编写中,这样有ORM 框架出现帮我们处理这些繁琐的代码。下面是一些出名常用的 ORM 框架:HibernateHibernate http:/www.hibernate.org iBatisiBatis http:/ Apache OJBApache OJB http:/db.apache.or

12、g/ojb/TopLinkTopLink http:/ Castor JDOCastor JDO http:/www.castor.org/jdo.html 我们把 Hibernate 等框架称为 ORM 思想的一个个优雅实现优雅实现(呕吐中,这不是旺旺老师杜撰的名称,其实好多资料一直这么称呼),优雅原因:不需要编写复杂的 SQL 语句 自动交换数据 免去繁琐的 rs 到实体类,或实体类到 sql 的转换 数据库对用户来说是透明的,不用关心底层的数据库,专注与 OO 领域的业务实体。主题:JPA 旺旺老师软件工程师培训教程 页面 7/31 WWW.EASYITEDU.COM 旺旺老师,版权所有

13、 1.31.3 JPAJPA 简介简介 1.3.11.3.1 框架的遗憾框架的遗憾 各种框架是那么优雅的实现了 ORM 思想。但问题来了,以前开发使用的是 hibernate 框架,新项目要使用 OJB,语法一样吗?使用方法一样吗?API 一样吗?答案显然是否定的。那要使用的话只有重新学习,不错,因为您有 hibernate 基础,学习起 OJB 一定速度神快,那过些天项目要使用 JDO 呢?是不是得从新学习?天哪,程序员的苦日子什么时候才能结束。这时我们想到,可不可以向 JDBC 那样定义一个 ORM 规范,让所有的框架去实现这个规范,这样我们只要学习了这个 ORM 规范就可以使用所有框架了

14、。OK,SUN 做了一件让人高兴的事情,制定了这样的规范,并且命名为 JPA。1.3.21.3.2 JPAJPA 规范规范 下面我们重点介绍 JPA 规范。1.3.2.11.3.2.1 JPAJPA 是什么是什么 JPA 的全称是 Java Persistence API,它通过注解或 XML 描述的方式完成对象关系映射。同时,JPA 就是一个ORMORM 规范规范,具体点说就是一些类(很少)和接口(很多)的集一些类(很少)和接口(很多)的集合。合。JPA 的实现:Oracle 提供 Toplink 实现 主题:JPA 旺旺老师软件工程师培训教程 页面 8/31 WWW.EASYITEDU.C

15、OM 旺旺老师,版权所有 Bea 提供 KODO 实现 JBoss 提供 Hibernate EntityManager 实现 其他厂商的实现Apache OpenJPA 图 1-4:JPA 规范部分实现 你可以暂时把 JPA 理解为是一些接口的集合,各个框架就实现了这些接口,所以只要掌握了 JPA 规范就可以使用所有实现框架了,免去了重复学习的苦恼。这里我们也能了解 SUN 引入新的 JPA ORM 规范出于两个原因:其一,简化现有 Java EE和 Java SE 应用的对象持久化的开发工作;其二,Sun 希望对 ORM 技术整合,实现天下归一,其实旺旺认为这点原因居多,并且很成功,从众多

16、实现框架的响应可以看出。同时,Sun 这次吸取了之前 EJB 规范惨痛失败的经历,试图充分吸收现有 ORM 框架的优点,得到了一个易于使用、伸缩性强的 ORM 规范。如 hibernate 的创始者 Gavin King 也是JPA(EJB)规范的制定者,或者事实上的领导者,所以当您学习完 Hibernate 后学习 JPA 将非常轻松。1.3.2.21.3.2.2 JPAJPA 规范包含内容规范包含内容 JPA 的总体思想和现有 Hibernate、TopLink,JDO 等 ORM 框架大体一致。总的来说,JPA包括以下 3 方面的技术:ORMORM 映射元数据映射元数据,JPA 支持 X

17、ML 和 JDK 5.0 注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;JPAJPA 的的 APIAPI,用来操作实体对象,执行 CRUD 操作,框架在后台替我们完成所有的事情,开发者从繁琐的 JDBC 和 SQL 代码中解脱出来。查询语言查询语言,JPAQL,这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的 SQL 语句紧密耦合。1.3.2.31.3.2.3 JPAJPA 与与 EJBEJB 关关系系 JPA 与 EJB 的关系:JPA 由 EJB3.0 软件专家组开发,作为 JSR-220 实现的一部

18、分,所以JPA 属于 EJB,是它的一部分,从这个角度说我们学习 JPA,相当于学习了部分 EJB。但它不仅限于 EJB3.0,能够脱离容器独立运行,你可以在 Web 应用、甚至桌面应用中使用。这里的容器指可以运行 EJB 的中间件服务器如 Jboss 等,关于 EJB,旺旺老师后期会有专门的课程讲解。主题:JPA 旺旺老师软件工程师培训教程 页面 9/31 WWW.EASYITEDU.COM 旺旺老师,版权所有 1.3.2.41.3.2.4 JPAJPA 在应用程序中的位置在应用程序中的位置 图 1-5:JPA 在应用程序中的位置 1.3.2.51.3.2.5 JPAJPA 与与 JDBCJ

19、DBC 的关系的关系 JPA 与 JDBC 都是规范,JDBC 是用 Java 应用程序连接数据库执行SQL语句的规范,而 JPA是个ORM 规范,ORM 规范的实现者一定使用了 JDBC 规范。1.41.4 JPAJPA 开发流程开发流程(M MY YE ECLIPSE CLIPSE 8.68.6+M+MY YSQLSQL)1.4.11.4.1 准备工作准备工作 JPA 前期的准备工作包括创建数据库表(使用 MySQL 数据库),使用 MyEclipse 工具的DBBrowser 创建连接以及创建 Java 项目,这里旺旺不再复述。CREATE DATABASE jpaTest;USE jp

20、aTest;CREATE TABLE student(stuId INT AUTO_INCREMENT PRIMARY KEY,stuName VARCHAR(20)NOT NULL,stuAge INT NOT NULL,context VARCHAR(50)NULL );主题:JPA 旺旺老师软件工程师培训教程 页面 10/31 WWW.EASYITEDU.COM 旺旺老师,版权所有 SELECT*FROM student 1.4.21.4.2 添加添加 JPAJPA 支持支持 图 1-6:项目添加 JPA 支持 1 1.4 4.2.2.1 1 选择框架类型选择框架类型 图 1-7:选择支

21、持框架 主题:JPA 旺旺老师软件工程师培训教程 页面 11/31 WWW.EASYITEDU.COM 旺旺老师,版权所有 大家看到在 MyEclispe8.5 中添加的支持 JPA 的框架有 Toplink,Hibernate 与OpengJPA,还有 MyEclispe 组织自己开发的 EclipseLink。这里我们暂时选择 Hibernate 的3.3 版本。1 1.4 4.2.2.2 2 持久化单元选择持久化单元选择 下图中的配置信息将影响到将来生成的 JPA 主配置文件。特别是 Persistence unit name(持久化单元名称),我们在项目代码中要使用。至于连接信息与数据

22、库名称旺旺就不说了。图 1-8:持久化单元选择 主题:JPA 旺旺老师软件工程师培训教程 页面 12/31 WWW.EASYITEDU.COM 旺旺老师,版权所有 1 1.4 4.2.2.3 3 结果结果 图 1-9:项目结构图 主题:JPA 旺旺老师软件工程师培训教程 页面 13/31 WWW.EASYITEDU.COM 旺旺老师,版权所有 Hibernate3.3 Core 是运行 hibernate 必备的东东 Hibernate3.3 Core Annotation 则是 hibernate 对 JPA 支持的 jar 包 Hibernate3.3 Advanced 主要是 C3PO

23、数据库连接池以及 JBoss 缓存等,暂时可以不用。与单独使用 Hibernate 类似,JPA 生成一个主配置文件,默认在 ME-TA 目录下,内容:org.hibernate.ejb.HibernatePersistence 配置文件不详细说了,还是希望大家注意上面方框内标红的持久化单元名称,后期使用。为是否显示生成的 SQL 语句。1.4.31.4.3 添加添加 POJOPOJO 类类 JPA 提供了两种方式配置持久化对象:POJO 类加映射文件的方式 使用注解标识的持久化类,我们成为映射类。这是我们以后使用的重点。1 1.4 4.3 3.1 1 MyEclipseMyEclipse 反

24、转工具反转工具生成生成 这里我们使用 MyEclipse 工具提供的反转工具生成。反转工程做两件事情:1,生成映射类。2,映射类在主配置文件中配置 图 1-10:生成 POJO 反转工程 主题:JPA 旺旺老师软件工程师培训教程 页面 14/31 WWW.EASYITEDU.COM 旺旺老师,版权所有 默认的实体名为表明,属性名为字段名,同时提供修改。图 1-10:生成 POJO 修改实体属性名 主题:JPA 旺旺老师软件工程师培训教程 页面 15/31 WWW.EASYITEDU.COM 旺旺老师,版权所有 1 1.4 4.3 3.2 2 映射类详解映射类详解 package com.wan

25、gwang.dao.pojo;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import static javax.persistence.GenerationType.IDENTITY;import javax.persistence.Id;import javax.persistence.Table;Entity Table(name=student,

26、catalog=jpatest)public class Student implements java.io.Serializable Id GeneratedValue(strategy=IDENTITY)Column(name=stuId,unique=true,nullable=false)private Integer id;Column(name=stuName,nullable=false,length=20)private String name;Column(name=stuAge,nullable=false)private Integer age;主题:JPA 旺旺老师软

27、件工程师培训教程 页面 16/31 WWW.EASYITEDU.COM 旺旺老师,版权所有 Column(name=context,length=50)private String context;/*get set 访问器省略 */EntityEntity:将领域对象标注为一个实体,表示需要保存到数据库中。TableTable:默认情况下类名即为表名,通过name属性显式指定表名,通过catalog设置数据库名,如果使用的是SQLServer,还有schema角色属性,我们使用一般为dbo。IdId:对应的属性是表的主键,一个实体只有一个 GeneratedValueGeneratedVal

28、ue:主键的产生策略,通过strategy属性指定。默认情况下,JPA自动选择一个最适合底层数据库的主键生成策略,如SqlServer对应identity,MySql对应auto increment。在javax.persistence.GenerationType中定义了以下几种可供选择的策略:IDENTITY:表自增键字段,Oracle不支持这种方式;AUTO:JPA自动选择合适的策略,是默认选项;SEQUENCE:通过序列产生主键,通过SequenceGenerator注解指定序列名,MySql不支持这种方式;TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更

29、易于数据库移植。暂不研究。Column(name=Column(name=stustuNameName):属性对应的表字段。我们并不需要指定表字段的类型,因为JPA会根据反射从实体属性中获取类型;如果是字符串类型,我们可以指定字段长度,以便可以自动生成DDL语句。Temporal(TemporalType.DATE)Temporal(TemporalType.DATE):如果属性是时间类型,因为数据表对时间类型有更严格的划分,所以必须指定具体时间类型。在javax.persistence.TemporalType枚举中定义了3种时间类型:DATE:等于java.sql.Date TIME:等于

30、java.sql.Time TIMESTAMP:等于java.sql.Timestamp 关于字段的属性配置,可以放在变量声明的上面,也可以放在get方法的上面,最好不要混合使用。1 1.4 4.3 3.3 3 JPAJPA 主配置文件配置映射类主配置文件配置映射类 org.hibernate.ejb.HibernatePersistence com.wangwang.dao.pojo.Student 1 1.4 4.3 3.4 4 映射类状态映射类状态 主题:JPA 旺旺老师软件工程师培训教程 页面 17/31 WWW.EASYITEDU.COM 旺旺老师,版权所有 实体对象拥有以下4个状态

31、,这些状态通过调用EntityManager接口方法发生迁移:新建态:新建态:新创建的实体对象,尚未拥有持久化主键,没有和持久化上下文关联起来。受控态:受控态:已经拥有持久化主键并和持久化上下文建立了联系;游离态:游离态:拥有持久化主键,但尚未和持久化上下文建立联系;删除态:删除态:拥有持久化主键,已经和持久化上下文建立联系,但已经被安排从数据库中删除。1.4.31.4.3 编写编写 JPAJPA 代码代码 DAO 类代码:package com.wangwang.dao.impl;import java.util.List;import javax.persistence.EntityMan

32、ager;import javax.persistence.EntityManagerFactory;import javax.persistence.EntityTransaction;import javax.persistence.Persistence;import com.wangwang.dao.IStudentDAO;import com.wangwang.dao.pojo.Student;public boolean save(Student stu)EntityManagerFactory emf=Persistence.createEntityManagerFactory(

33、testJPAPU);EntityManager em=emf.createEntityManager();EntityTransaction et=em.getTransaction();et.begin();boolean isSave=true;try em.persist(stu);mit();catch(Exception e)e.printStackTrace();et.rollback();isSave=false;finally em.close();emf.close();return isSave;主题:JPA 旺旺老师软件工程师培训教程 页面 18/31 WWW.EASY

34、ITEDU.COM 旺旺老师,版权所有 1.4.41.4.4 编写单元测试,运行编写单元测试,运行 测试代码:IStudentDAO studentDAO;Before public void setUp()throws Exception studentDAO=new StudentDAOJPAImpl();After public void tearDown()throws Exception studentDAO=null;Test public void testSave()Student student=new Student(wangwang,28,娃是好娃,社会把娃海了);Ass

35、ert.assertEquals(studentDAO.save(student),true);1.51.5 JPAJPA 组件组件 JavaEE 5.0 中所定义的 JPA 接口个数并不多,它们位于 javax.persistence 和javax.persistence.spi 两个包中。javax.persistence 包中大部分 API 都是注解类,除此之外还包括 EntityManager、Query 等持久化操作接口。而 javax.persistence.spi 包中的4 个 API,是 JPA 的服务层接口。1.5.11.5.1 P PERSISTENCEERSISTENCE

36、P PROVIDERROVIDER组件组件 我们一直说 JPA 是一个持久化层规范,各个框架是实现,那如何编写实现呢?首先框架提供者必须实现 jpa 的 javax.persistence.spi.PersistenceProvider 接口(PersistenceProvider 接口它定义了创建一个 EntityManagerFactory 实例的方法:)如 hibernate 中的 org.hibernate.ejb.HibernatePersistence 就实现了该接口。然后此类必须在主配置 JPA 主配置文件中声明,以便程序使用它。如以下是 Hibernate 的声明。主题:JPA

37、 旺旺老师软件工程师培训教程 页面 19/31 WWW.EASYITEDU.COM 旺旺老师,版权所有 org.hibernate.ejb.HibernatePersistence com.wangwang.dao.pojo.Student 1.5.21.5.2 P PERSISTENCEERSISTENCE 组件组件 这时 JPA 规范中的唯一一个类,Persistence 的功能是利用注册的具体PersistenceProvider 创建实体工厂类 EntityManagerFactory。Persistence 它更像一个 PersistenceProvider 管理者,或者说 Pers

38、istenceProvider代理类,即根据系统注册使用的 PersistenceProvider 创建 EntityManagerFactory,如上例中我们使用 Persistence.createEntityManagerFactory()方法本质上是调用HibernatePersistence 的 createEntityManagerFactory 方法产生 EntityManagerFactory。这里其实还有一个 PersistenceUnitInfo 接口,有了一个 void addTransformer(ClassTransformer transformer)方法,通过该方

39、式可以添加一个javax.persistence.spi.ClassTransformer,并通过 PersistenceProvider 开放给容器,以便容器在实体类文件加载到 JVM 之前进行代码的增强,使元数据生效。JPA 厂商负责提供 ClassTransformer 接口的实现。图 1-10:JPA 各组件关系 1.5.31.5.3 E ENTITYNTITYM MANAGERANAGERF FACTORYACTORY组件组件 接口,负责创建 EntityManager。主题:JPA 旺旺老师软件工程师培训教程 页面 20/31 WWW.EASYITEDU.COM 旺旺老师,版权所有

40、 1.5.41.5.4 E ENTITYNTITYM MANAGERANAGER组件组件 接口,实体对象由实体管理器进行管理,JPA 使用 javax.persistence.EntityManager代表实体管理器。实体管理器和持久化上下文关联,持久化上下文是一系列实体的管理环境,我们通过 EntityManager 和持久化上下文进行交互。有两种类型的实体管理器:容器型:容器型的实体管理器由容器负责实体管理器之间的协作,在一个 JTA 事务中,一个实体管理器的持久化上下文的状态会自动广播到所有使用 EntityManager 的应用程序组件中。Java EE 应用服务器提供的就是管理型的实

41、体管理器;这个在后期讲解 EJB 时候再讲解使用。应用程序型:实体管理器的生命周期由应用程序控制,通过 EntityManagerFactory 的createEntityManager 创建 EntityManager 实例。现在我们使用使用的就是应用程序型。下面是EntityManager的一些主要的接口方法:void persist(Object entity)void persist(Object entity)新实体实例将转换为受控状态。这意谓着当persist()方法所在的事务提交时,实体的数据将保存到数据库中。如果实体已经被持久化,那么调用persist()操作不会发生任何事情。

42、如果对一个已经删除的实体调用persist()操作,删除态的实体又转变为受控态。如果对游离状的实体执行persist()操作,将抛出 IllegalArgumentException。在一个实体上调用persist()操作,将广播到和实体关联的实体上,执行相应的级联持久化操作;void remove(Object entity)void remove(Object entity)通过调用remove()方法删除一个受控的实体。如果实体声明为级联删除(cascade=REMOVE 或者cascade=ALL),被关联的实体也会被删除。在一个新建状态的实体上调用remove()操作,将被忽略。如果

43、在游离实体上调用remove()操作,将抛出 IllegalArgumentException,相关的事务将回滚。如果在已经删除的实体上执行remove()操作,也会被忽略;void flush()void flush()将受控态的实体数据同步到数据库中;T merge(T entity)T merge(T entity)将一个游离态的实体持久化到数据库中,并转换为受控态的实体;T find(Class entityClass,ObjectT find(Class entityClass,Object primaryKey)primaryKey)以主键查询实体对象,这里使用的是即时加载。ent

44、ityClass是实体的类,primaryKey是主键值,如以下的代码查询Student实体:Student t=em.find(Student.class,1);Query createQuery(String qlString)Query createQuery(String qlString)创建查询接口对象 1.61.6 H HIBERNATEIBERNATEAPIAPI 运行运行 主题:JPA 旺旺老师软件工程师培训教程 页面 21/31 WWW.EASYITEDU.COM 旺旺老师,版权所有 主配置文件 org.hibernate.dialect.SQLServerDialect

45、jdbc:sqlserver:/localhost:1433 sa com.microsoft.sqlserver.jdbc.SQLServerDriver mssql true 运行类:public static void main(String args)/Configuration config=new Configuration().configure();AnnotationConfiguration config=new AnnotationConfiguration().configure();SessionFactory sf=config.buildSessionFactor

46、y();Session se=sf.openSession();Student stu=(Student)se.get(Student.class,1);System.out.println(stu.getBtd();se.close();sf.close();第二章:关联映射 2 2.1.1 四种映射关系四种映射关系 主题:JPA 旺旺老师软件工程师培训教程 页面 22/31 WWW.EASYITEDU.COM 旺旺老师,版权所有 2 2.2 2 单双向的区别单双向的区别 单向是只在一方有另一方的引用。谁在前,谁就有对方应用。一对多,一方有多方的Set 集合,多方有一方的实体引用。2.32.

47、3 双向双向一对一对多多关联关联 2.3.12.3.1 一的一方一的一方 OneToMany(cascade=CascadeType.ALL,fetch=CascadeType.LAZY,mappedBy=men)public Set getWomens()return this.womens;主题:JPA 旺旺老师软件工程师培训教程 页面 23/31 WWW.EASYITEDU.COM 旺旺老师,版权所有 OneToManyOneToMany 表示一对多关联关系的注解,括号内全是他的属性。cascade=CascadeType.PERSIST,CascadeType.REMOVEcascad

48、e=CascadeType.PERSIST,CascadeType.REMOVE 设置保存和删除级联,如果只有一种方式,不需要。fetch=FetchType.LAZYfetch=FetchType.LAZY 即时加载或延迟加载 mappedBy=menmappedBy=men 定义类之间的双向关系,如果是单向,不需要设定。targetEntity=Order.targetEntity=Order.classclass 指定关联的实体类,通常情况下不需要指定。系统根据属性自动设置。2.3.22.3.2 多多的一方的一方 ManyToOne(fetch=FetchType.LAZY)JoinCo

49、lumn(name=menId,nullable=false)public Men getMen()return this.men;ManyToOneManyToOne 表示多对一的关联关系的注解,括号内全是他的属性。c cascade=CascadeType.PERSISTascade=CascadeType.PERSIST 设置保存级联。JoinColumnJoinColumn 设置 Women 表的外键。name=name=menIdmenId 外键的名称。2.42.4 双双对对多关联多关联 一方编写:Course ManyToMany(fetch=FetchType.LAZY,mapp

50、edBy=courses)mappedBy 为对方实体类中自己类型的 set 集合。另一方编写:Student JoinTable(catalog=ManyToMany,schema=dbo,name=student_course_link,joinColumns=JoinColumn(name=sid),inverseJoinColumns=JoinColumn(name=cid)Catalog 数据库名 主题:JPA 旺旺老师软件工程师培训教程 页面 24/31 WWW.EASYITEDU.COM 旺旺老师,版权所有 Schema 角色名 Name 中间表名 joinColumns 自己与

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁