{企业通用培训}Hibernate讲义

上传人:精****库 文档编号:140135560 上传时间:2020-07-27 格式:PPTX 页数:92 大小:242.37KB
返回 下载 相关 举报
{企业通用培训}Hibernate讲义_第1页
第1页 / 共92页
{企业通用培训}Hibernate讲义_第2页
第2页 / 共92页
{企业通用培训}Hibernate讲义_第3页
第3页 / 共92页
{企业通用培训}Hibernate讲义_第4页
第4页 / 共92页
{企业通用培训}Hibernate讲义_第5页
第5页 / 共92页
点击查看更多>>
资源描述

《{企业通用培训}Hibernate讲义》由会员分享,可在线阅读,更多相关《{企业通用培训}Hibernate讲义(92页珍藏版)》请在金锄头文库上搜索。

1、Hibernate简介,培训讲师: 张永军,Hibernate的作用,解决ORM问题 成为ORM第一首选 通常用于设计Dao层 极大的简化了数据库访问代码 良好的数据库可移植性 无侵入式的设计,无污染,Hibernate在应用程序中的位置,JDBC,Business Classes,关系数据库,Data Classes,持久层组件,Hibernate过程及原理,设计实体类(POJO) 通过注解或者xml文件定义实体类和数据库表的映射关系 Hibernate框架根据映射关系定义和数据库配置动态生成SQL语句,通过JDBC来执行SQL语句,原理示意,Student,t_student,Studen

2、t.hbm.xml,session.save(student),Hibernate工作流程: 根据类型找到映射文件 读取映射关系 根据映射关系生成insert语句 用student对象的属性值作为Sql参数值 创建运行PreparedStatement.executeUpdate方法,编写第一个Hibernate程序,Step1:导入Hiernate jar包 Step2:导入jdbc驱动jar包 Step3:编写Hibernate配置文件 从官方示例程序中拷贝模板文件 设置数据库相关配置 定义自动生成数据库表 定义运行时显示SQL语句 指定映射文件,create,true,true,编写第一

3、个Hibernate程序,编写实体类UseruserId,name,birthDate 编写实体映射文件User.hbm.xml 必须位于classpath下 主键的生成方式 处理日期类型 映射文件详解 编写测试程序 初始化配置 获取SessionFactory对象并打开Session 通过事务插入User对象 关闭Session,编写第一个Hibernate程序,编写工具类HibernateSessionUtil完成Session获取关闭工作 通过MyEclipse自动生成HibernateSessionFactory类 剖析HibernateSessionFactory类,编写第一个Hib

4、ernate程序,从数据库中取得某个user对象:Session.get方法 对该user对象进行修改Session.update方法 删除user对象。Session.delete方法 update方法 vs saveOrUpdate方法,实体生命周期,实体对象的生命周期有三种状态: Transient(自由状态) 实体对象在内在中自由存在,它与数据库中的记录无关联,只是一个普通的 Persistent (持久状态) 实体对象处于由Hibernate所管理的状态,实体和数据库中的记录有关联,其变更将由Hibernate固化到数据库中。 Detached (游离状态) 处于Persistent

5、状态的对象,其对应的Session实例关闭之后,那么,此对象就处于Detached状态。Detached状态和Transient状态的区别在于Detached状态的对象可以再次与某个Session实例相关联而成为Persistent对象。,实体状态转换,User user=new User(); user.setName(“John”); Transaction tx=session.beginTransaction(); session.save(user); mit(); session.close(); Transaction tx2=session2.beginTransaction(

6、); session2.update(user); user.setName(“Jonh_2”); mit();,1. 此时user对象处于Transient状态。,2. 此时user对象已经由Hibernate纳入管理容器,处于Persistent状态。,3. User对象此时状态为Detached,因为与其关联的session已经关闭。,4. 此时处于Detached状态的user对象再次借助session2由Hibernate纳入管理容器,恢复Persistent状态。,5. 由于user对象再次处于Persistent状态,因此其属性的改变将由Hibernate自动固化到数据库中。,实

7、体生命周期示例图,save() saveOrUpdate(),new,garbage,delete(),Transient,Persistent,Detached,get load iterate etc.,close() * clear() * evict(),update saveOrUpdate lock,garbage,* 对session里的所有实体对象都有效,VO和PO,从实体对象是否被纳入Hibernate实体管理容器的角度,Transient和Detached状态的实体对象可以统称为VO(Value Object),而被管理的实体对象称为PO(Persistent Object

8、)。两者的区别: 1.VO是相对独立的实体对象,处于非管理状态。 2.PO是Hibernate纳入其实体管理容器(Entity Map)的对象,它代表了与数据库中某条记录对应的Hibernate实体,PO的变化在事务提交时将反映到实际数据库中。 3.如果一个PO与其对应的Session实例分离,那么此时,它又会变成一个VO。,映射文件初探-主键映射, (4) (5) (1)、name (可选) :标识属性的名称。 (2)、type(可选):标识Hibernate类型的名字。 (3)、column(可选默认为属性名):对应数据库表的主键字段的名字。 (4)、unsaved-value(可选默认为

9、null):这个值用来判断对象是否要保存。 (5)、主键生成方式。,主键生成策略,assigned 主键由应用逻辑产生,数据交由Hibernate保存时,主键值已经设置完成,无需Hibernate干预。 hilo 通过hi/lo算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态 seqhilo 与hilo类似,通过hilo算法实现主键生成机制,只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。 increment 主键按数值顺序递增。 identity 采用数据库提供的主键生成机制,如SQL Server,MySQL中的自增长主键生成机制

10、,主键生成策略(续),sequence 采用数据库提供的sequence机制生成主键,如Oracle Sequence native 由Hibernate根据数据库适配器中的定义,自动采用identity、hilo、sequence的其中一种作为主键生成方式 uuid.hex 由Hibernate基于128位唯一值产生算法,根据当前设备IP,时间,JVM启动时间,内部自增量等4个参数生成十六进制数值(编码后以长度为32位的字符串表示)作为主键。利用uuid.hex方式生成主键将提供最好的数据插入性能和数据库平台适应性 uuid.String 与uuid.hex类似,只是生成的主键不进行编码(长

11、度16位),映射文件初探-属性映射, (1) Name:指定了映射类中的属性名为” propertyName”,此属性将被映射到指定的库表字段。 (2) column(可选):指定了库表中对应映射类属性的字段名。 (3) type(可选):指定了映射字段的数据类型 (4) update, insert (可选 - 默认为 true) :表明在用于UPDATE 和/或 INSERT的SQL语句中是否包含这个字段。 (5) formula (可选): 一个SQL表达式,定义了这个计算(computed) 属性的值。计算属性没有和它对应的数据库字段。,定义1对1关联,一对一关联包括两种形式: 主键关

12、联 惟一外键关联,1对1主键关联实体定义,UseruserId:Integer,birthDay:Date,name:String,passport:Passport PassportpassportId:Integer,serial:String,expiry:Integer,user:User,定义1对1关联-主键关联方式,一对一主键关联形式即两张关联表通过主键形式一对一映射关系。Hibernate中,通过one-to-one节点对一对一关系进行定义。典型实例:中国公民只允许拥有一份护照。 User.hbm.xml . . ,Passport.hbm.xml user ,one-to-on

13、e详解,1. name: 属性的名字POJO中的。 2. class (可选 - 默认是通过反射得到的属性类型):被关联的类的名字。 3. cascade(级联) (可选) 表明操作是否从父对象级联到被关联的对象。 4. constrained(约束) (可选) 表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。这个选项影响save()和delete()在级联执行时的先后顺序(也在schema export tool中被使用)。,one-to-one详解,5. outer-join(外连接) (可选 - 默认为 自动): 当设置hibernat

14、e.use_outer_join的时候,对这个关联允许外连接抓取。 6. property-ref: (可选) 指定关联类的一个属性,这个属性将会和本外键相对应。如果没有指定,会使用对方关联类的主键POJO中POJO类的实例。 7. access (可选 - 默认是 property): Hibernate用来访问属性的策略,one-to-one示例代码,对关联对象的保存: User user=new User(); user.setAge(new Integer(20); user.setName(“张小小”); Passport passport=new Passport (); pass

15、port.setSerial(“PDR1234567”); passport.setExpiry(new Integer(20080101); /相互设置关联 passport.setUser(user); user.setPassport(passport); Transaction tx=session.beginTransaction(); session.save(user) mit();,主键关联思考,是否可以不设置双向关联,如果不设置双向关联,本案例如何设置? constrained含义是什么?通常设置在哪一方?,1对1关联-惟一外键关联实体定义,UseruserId:Intege

16、r,birthDay:Date,name:String,group:Group GroupgroupId:Integer,name:String,desc:String,定义1对1关联-惟一外键关联方式, . ,1对1关联-惟一外键关联方式,思考: 此种方式下保存顺序对程序有关系吗? 背后的原理是什么? 和前一种1对1关系的区别在哪里? 什么时候采用关联主键,什么时候采用外键关联,多对一关联,在某个实体中存在一个属性,该属性是另外一个实体类型。多个当前实体对应了一个对方一个实体 示例,一个用户有多个房屋,Houseid:Integer,address:String,user:User,多对一关联,House.hbm.xml ,多对一关联-抓取策略及lazy,fetch=join|select lazy=proxy|no-proxy|false,一对多关联,一对多关联在系

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业/管理/HR > 企业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号