传智播客hibernate教程
Hibernate 学习教程大纲

Hibernate 学习教程第1课课程内容. 6第2课Hibernate UML图. 6第3课风格. 7第4课资源. 7第5课环境准备. 7第6课第一个示例HibernateHelloWorld 7第7课建立Annotation版本的HellWorld 9第8课什么是O/RMapping 11一、定义:. 11二、 Hibernate的创始人:. 11三、 Hibernate做什么:. 12四、 Hibernate存在的原因:. 12五、 Hibernate的优缺点:. 12六、 Hibernate使用范围:. 12第9课Hibernate的重点学习:Hibernate的对象关系映射. 12一、对象---关系映射模式. 12二、常用的O/R映射框架:. 13第10课模拟Hibernate原理(OR模拟) 13一、项目名称. 13二、原代码. 13第11课Hibernate基础配置. 15一、提纲. 15二、介绍MYSQL的图形化客户端. 16三、 Hibernate.cfg.xml:hbm2ddl.auto 16四、搭建日志环境并配置显示DDL语句. 16五、搭建Junit环境. 16六、 ehibernate.cfg.xml : show_sql 17七、 hibernate.cfg.xml :format_sql 17八、表名和类名不同,对表名进行配置. 17九、字段名和属性相同. 17十、字段名和属性名不同. 17十一、不需要(持久化)psersistence的字段. 18十二、映射日期与时间类型,指定时间精度. 18十三、映射枚举类型. 19第12课使用hibernate工具类将对象模型生成关系模型. 19第13课ID主键生成策略. 20一、 Xml方式. 20<generator>元素(主键生成策略) 20二、 annotateon方式. 211、AUTO默认. 212、IDENTITY 223、SEQUENCE 224、为Oracle指定定义的Sequence 225、TABLE - 使用表保存id值. 23三、联合主键. 241、xml方式. 242、annotation方式. 27第14课Hibernate核心开发接口(重点) 29一、 Configuration(AnnotationConfiguration) 29二、 SessionFactory 29三、 Session 291、管理一个数据库的任务单元. 292、 save(); 293、 delete() 294、 load() 295、 Get() 306、 load()与get()区别. 317、 update() 318、 saveOrUpdate() 329、 clear() 3210、 flush() 3311、 evict() 33第15课持久化对象的三种状态. 35一、瞬时对象(TransientObject):. 35二、持久化对象(PersistentObject):. 35三、离线对象(DetachedObject):. 35四、三种状态的区分:. 35五、总结:. 35第16课关系映射(重点) 36一、一对一关联映射. 36(一) 唯一外键关联-单向(unilateralism) 37(二) 唯一外键关联-双向. 40(三) 主键关联-单向(不重要) 41(四) 主键关联-双向(不重要) 44(五) 联合主键关联(Annotation方式) 44二、 component(组件)关联映射. 45(一) Component关联映射:. 45(二) User实体类:. 45(三) Contact值对象:. 46(四) xml--User映射文件(组件映射):. 46(五) annotateon注解. 46(六) 导出数据库输出SQL语句:. 47(七) 数据表结构:. 47(八) 组件映射数据保存:. 47三、多对一–单向. 48(一) 对象模型图:. 48(二) 关系模型:. 48(三) 关联映射的本质:. 48(四) 实体类. 48(五) xml方式:映射文件:. 49(六) annotation 50(七) 多对一存储(先存储group(对象持久化状态后,再保存user)):. 50(八) 重要属性-cascade(级联):. 51(九) 多对一加载数据. 51四、一对多- 单向. 51(一) 对象模型:. 52(二) 关系模型:. 52(三) 多对一、一对多的区别:. 52(四) 实体类. 52(五) xml方式:映射. 52(六) annotateon注解. 53(七) 导出至数据库(hbmàddl)生成的SQL语句:. 53(八) 一对多单向存储实例:. 53(九) 生成的SQL语句:. 54(十) 一对多,在一的一端维护关系的缺点:. 54 (十一) 一对多单向数据加载:. 54(十二) 加载生成SQL语句:. 54五、一对多- 双向. 54(一) xml方式:映射. 55(二) annotateon方式注解. 55(三) 数据保存:. 56(四) 关于inverse属性:. 56(五) Inverse和cascade区别:. 56(六) 一对多双向关联映射总结:. 57六、多对多- 单向. 57(一) 实例场景:. 57(二) 对象模型:. 57(三) 关系模型:. 57(四) 实体类. 57(五) xml方式:映射. 58(六) annotation注解方式. 58(七) 生成SQL语句. 59(八) 数据库表及结构:. 59(九) 多对多关联映射单向数据存储:. 59(十) 多对多关联映射单向数据加载:. 61七、多对多- 双向. 61(一) xml方式:映射. 61(二) annotation注解方式. 62八、关联关系中的CRUD_Cascade_Fetch 63九、集合映射. 63十、继承关联映射. 64(一) 继承关联映射的分类:. 64(二) 对象模型:. 64(三) 单表继承SINGLE_TABLE:. 64(四) 具体表继承JOINED:. 70(五) 类表继承TABLE_PER_CLASS 72(六) 三种继承关联映射的区别:. 74第17课hibernate树形结构(重点) 75一、节点实体类:. 75二、 xml方式:映射文件:. 75三、 annotation注解. 76四、测试代码:. 76五、相应的类代码:. 76第18课作业-学生、课程、分数的映射关系. 79一、设计. 79二、代码:. 79三、注意. 80第19课Hibernate查询(Query Language) 80一、 Hibernate可以使用的查询语言. 80二、实例一. 80三、实体一测试代码:. 82四、实例二. 86五、实例二测试代码. 87第20课Query by Criteria(QBC) 89一、实体代码:. 89二、 Restrictions用法. 90三、工具类Order提供设置排序方式. 91四、工具类Projections提供对查询结果进行统计与分组操作. 91五、 QBC分页查询. 92六、 QBC复合查询. 92七、 QBC离线查询. 92第21课Query By Example(QBE) 92一、实例代码. 92第22课Query.list与query.iterate(不太重要) 93一、 query.iterate查询数据. 93二、 query.list()和query.iterate()的区别. 94三、两次query.list() 94第23课性能优化策略. 95第24课hibernate缓存. 95一、 Session级缓存(一级缓存) 95二、二级缓存. 951、二级缓存的配置和使用:. 962、二级缓存的开启:. 963、指定二级缓存产品提供商:. 964、使用二级缓存. 975、应用范围. 996、二级缓存的管理:. 997、二级缓存的交互. 1008、总结. 102三、查询缓存. 102四、缓存算法. 103第25课事务并发处理. 104一、数据库的隔离级别:并发性作用。
Hibernate教程

主键生成策略(续)
sequence 采用数据库提供的sequence机制生成主键,如Oracle Sequence native 由Hibernate根据数据库适配器中的定义,自动采用identity、hilo、 sequence的其中一种作为主键生成方式
uuid.hex
由Hibernate基于128位唯一值产生算法,根据当前设备IP,时间,JVM启 动时间,内部自增量等4个参数生成十六进制数值(编码后以长度为32位的字 符串表示)作为主键。利用uuid.hex方式生成主键将提供最好的数据插入性 能和数据库平台适应性 uuid.String 与uuid.hex类似,只是生成的主键不进行编码(长度16位)
Data Classes
Hibernate过程及原理
设计实体类(简单的Java对象,Plain Old Java Objects, POJO) 通过注解或者xml文件定义实体类和数据 库表的映射关系 Hibernate框架根据映射关系定义和数据库 配置动态生成SQL语句,通过JDBC来执 行SQL语句
Transaction tx2=session2.beginTransaction(); session2.update(user); 4. 此时处于Detached状态的user对象 再次借助session2由Hibernate纳入管
user.setName(“Jonh_2”);
mit();
Persistent
close() * clear() * evict() update saveOrUpdate lock
garbage
Detached
* 对session里的所有实体对象都有效
VO和PO
从实体对象是否被纳入Hibernate实体管理容器的角度, Transient和Detached状态的实体对象可以统称为VO(Value Object),而被管理的实体对象称为PO(Persistent Object)。 两者的区别: 1.VO是相对独立的实体对象,处于非管理状态。
Hibernate教程---看这一篇就够了

Hibernate教程---看这⼀篇就够了1 Hibernate概述1.1什么是hibernate框架(重点)1 hibernate框架应⽤在javaee三层结构中 dao层框架2 在dao层⾥⾯做对数据库crud操作,使⽤hibernate实现crud操作,hibernate底层代码就是jdbc,hibernate对jdbc进⾏封装,使⽤hibernate好处,不需要写复杂jdbc代码了,不需要写sql语句实现3 hibernate开源的轻量级的框架4 hibernate版本Hibernate3.xHibernate4.xHibernate5.x(学习)1.2 什么是orm思想(重点)1 hibernate使⽤orm思想对数据库进⾏crud操作2 在web阶段学习 javabean,更正确的叫法实体类3 orm:object relational mapping,对象关系映射⽂字描述:(1)让实体类和数据库表进⾏⼀⼀对应关系让实体类⾸先和数据库表对应让实体类属性和表⾥⾯字段对应(2)不需要直接操作数据库表,⽽操作表对应实体类对象画图描述2 Hibernate⼊门2.1 搭建hibernate环境(重点)第⼀步导⼊hibernate的jar包因为使⽤hibernate时候,有⽇志信息输出,hibernate本⾝没有⽇志输出的jar包,导⼊其他⽇志的jar包不要忘记还有mysql驱动的jar包第⼆步创建实体类package cn.itcast.entity;public class User {/*hibernate要求实体类有⼀个属性唯⼀的*/// private int uid;private String uid;private String username;private String password;private String address;// public int getUid() {// return uid;// }// public void setUid(int uid) {// this.uid = uid;// }public String getUsername() {return username;}public String getUid() {return uid;}public void setUid(String uid) {this.uid = uid;}public void setUsername(String username) {ername = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}}(1)使⽤hibernate时候,不需要⾃⼰⼿动创建表,hibernate帮把表创建第三步配置实体类和数据库表⼀⼀对应关系(映射关系)使⽤配置⽂件实现映射关系(1)创建xml格式的配置⽂件- 映射配置⽂件名称和位置没有固定要求- 建议:在实体类所在包⾥⾯创建,实体类名称.hbm.xml(2)配置是是xml格式,在配置⽂件中⾸先引⼊xml约束- 学过约束dtd、schema,在hibernate⾥⾯引⼊的约束dtd约束(3)配置映射关系<hibernate-mapping><!-- 1 配置类和表对应class标签name属性:实体类全路径table属性:数据库表名称--><class name="er" table="t_user"><!-- 2 配置实体类id和表id对应hibernate要求实体类有⼀个属性唯⼀值hibernate要求表有字段作为唯⼀值--><!-- id标签name属性:实体类⾥⾯id属性名称column属性:⽣成的表字段名称--><id name="uid" column="uid"><!-- 设置数据库表id增长策略native:⽣成表id值就是主键⾃动增长--><generator class="native"></generator></id><!-- 配置其他属性和表字段对应name属性:实体类属性名称column属性:⽣成表字段名称--><property name="username" column="username"></property><property name="password" column="password"></property><property name="address" column="address"></property></class></hibernate-mapping>第四步创建hibernate的核⼼配置⽂件(1)核⼼配置⽂件格式xml,但是核⼼配置⽂件名称和位置固定的- 位置:必须src下⾯- 名称:必须hibernate.cfg.xml(2)引⼊dtd约束(3)hibernate操作过程中,只会加载核⼼配置⽂件,其他配置⽂件不会加载第⼀部分:配置数据库信息必须的第⼆部分:配置hibernate信息可选的第三部分:把映射⽂件放到核⼼配置⽂件中<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!-- 第⼀部分:配置数据库信息必须的 --><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property> <property name="ername">root</property><property name="hibernate.connection.password">root</property><!-- 第⼆部分:配置hibernate信息可选的--><!-- 输出底层sql语句 --><property name="hibernate.show_sql">true</property><!-- 输出底层sql语句格式 --><property name="hibernate.format_sql">true</property><!-- hibernate帮创建表,需要配置之后update: 如果已经有表,更新,如果没有,创建--><property name="hibernate.hbm2ddl.auto">update</property><!-- 配置数据库⽅⾔在mysql⾥⾯实现分页关键字 limit,只能使⽤mysql⾥⾯在oracle数据库,实现分页rownum让hibernate框架识别不同数据库的⾃⼰特有的语句--><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!-- 第三部分:把映射⽂件放到核⼼配置⽂件中必须的--><mapping resource="cn/itcast/entity/User.hbm.xml"/></session-factory></hibernate-configuration>2.2 实现添加操作第⼀步加载hibernate核⼼配置⽂件第⼆步创建SessionFactory对象第三步使⽤SessionFactory创建session对象第四步开启事务第五步写具体逻辑 crud操作第六步提交事务第七步关闭资源@Testpublic void testAdd() {// 第⼀步加载hibernate核⼼配置⽂件// 到src下⾯找到名称是hibernate.cfg.xml//在hibernate⾥⾯封装对象Configuration cfg = new Configuration();cfg.configure();// 第⼆步创建SessionFactory对象//读取hibernate核⼼配置⽂件内容,创建sessionFactory//在过程中,根据映射关系,在配置数据库⾥⾯把表创建SessionFactory sessionFactory = cfg.buildSessionFactory(); // 第三步使⽤SessionFactory创建session对象// 类似于连接Session session = sessionFactory.openSession();// 第四步开启事务Transaction tx = session.beginTransaction();// 第五步写具体逻辑 crud操作//添加功能User user = new User();user.setUsername("⼩王");user.setPassword("250");user.setAddress("⽇本");//调⽤session的⽅法实现添加session.save(user);// 第六步提交事务mit();// 第七步关闭资源session.close();sessionFactory.close();}3 内容⽬录1 实体类编写规则2 hibernate主键⽣成策略(1)native(2)uuid3 实体类操作(1)crud操作(2)实体类对象状态4 hibernate的⼀级缓存5 hibernate的事务操作(1)事务代码规范写法6 hibernate其他的api(查询)(1)Query(2)Criteria(3)SQLQuery3.1 实体类编写规则1 实体类⾥⾯属性私有的2 私有属性使⽤公开的set和get⽅法操作3 要求实体类有属性作为唯⼀值(⼀般使⽤id值)4 实体类属性建议不使⽤基本数据类型,使⽤基本数据类型对应的包装类(1)⼋个基本数据类型对应的包装类- int – Integer- char—Character、- 其他的都是⾸字母⼤写⽐如 double – Double(2)⽐如表⽰学⽣的分数,假如 int score;- ⽐如学⽣得了0分,int score = 0;- 如果表⽰学⽣没有参加考试,int score = 0;不能准确表⽰学⽣是否参加考试l 解决:使⽤包装类可以了, Integer score = 0,表⽰学⽣得了0分,表⽰学⽣没有参加考试,Integer score = null;3.2 Hibernate主键⽣成策略1 hibernate要求实体类⾥⾯有⼀个属性作为唯⼀值,对应表主键,主键可以不同⽣成策略2 hibernate主键⽣成策略有很多的值3 在class属性⾥⾯有很多值(1)native:根据使⽤的数据库帮选择哪个值(2)uuid:之前web阶段写代码⽣成uuid值,hibernate帮我们⽣成uuid值3.3 实体类操作对实体类crud操作添加操作1 调⽤session⾥⾯的save⽅法实现根据id查询1 调⽤session⾥⾯的get⽅法实现修改操作1 ⾸先查询,修改值(1)根据id查询,返回对象删除操作1 调⽤session⾥⾯delete⽅法实现3.4 实体类对象状态(概念)1 实体类状态有三种(1)瞬时态:对象⾥⾯没有id值,对象与session没有关联(2)持久态:对象⾥⾯有id值,对象与session关联(3)托管态:对象有id值,对象与session没有关联2 演⽰操作实体类对象的⽅法(1)saveOrUpdate⽅法:实现添加、实现修改3.5 Hibernate的⼀级缓存什么是缓存1 数据存到数据库⾥⾯,数据库本⾝是⽂件系统,使⽤流⽅式操作⽂件效率不是很⾼。
06 Hibernate一级缓存

Hibernate一级缓存
北京传智播客教育
—高级软件人才实作培训专家 ! Hibernate缓存
缓存是存储数据的临时空间,减少从数据库中查询 数据的次数 Hibernate中提供有两种缓存机制
一级缓存(Hibernate自身携带) 二级缓存(使用外部技术)
北京传智播客教育
—高级软件人才实作培训专家 ! Hibernate操作一级缓存
刷新一级缓存
s.flush();
清除一级缓存
s.clear();
清除一级缓存中指定对象
s.evict(obj);
按照OID重新加载一级缓存中的PO(使用数据库中数 据覆盖一级缓存数据及快照数据)
s.refresh(obj);
北京传智播客教育
—高级软件人才实作培训专家 ! Hibernate一级缓存刷新时机(了解)
所谓Hibernate一级缓存刷新时机指一级缓存中存在的 修改数据何时会被同步到数据库表中 刷新时机有四种(FlushModel常量)
ALWAYS:任意操作导致刷新(效率过低) AUTO:根据操作功能区别是否刷新(默认) COMMIT:提交事务时刷新 MANUAL:手动执行刷新时进行刷新(提交事务不会触发)
进行属性更新,只会产生一条update语句,此时PO状态的改 变会在缓存进行刷新时才完成最终操作,除非提前刷新缓存 PO属性的更新无需调用update操作,缓存刷新时自动完成
北京传智播客教育
—高级软件人才实作培训专家 ! update操作的注意事项(2)
update将DO→PO操作会强制完成一次更新操作, 无论数据是否发生变化,此时可根据业务需要选择
hibernate教程

hibernate3.0用法hibernate教程非hibernate基础教程HQL查询:Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装。
完整的HQL语句形势如下:Selec t/update/delete…… from …… where …… group by …… having …… order by …… asc/desc其中的update/delete为Hibernate3中所新添加的功能,可见HQL查询非常类似于标准SQL 查询。
由于HQL查询在整个Hibernate实体操作体系中的核心地位,这一节我将专门围绕HQL操作的具体技术细节进行讲解。
1、实体查询:有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子:String hql=”from User user ”;List list=session.CreateQuery(hql).list();上面的代码执行结果是,查询出User实体对象所对应的所有数据,而且将数据封装成User 实体对象,并且放入List中返回。
这里需要注意的是,Hibernate的实体查询存在着对继承关系的判定,比如我们前面讨论映射实体继承关系中的Employee实体对象,它有两个子类分别是HourlyEmployee,SalariedEmployee,如果有这样的HQL语句:“from Employee”,当执行检索时Hibernate会检索出所有Employee类型实体对象所对应的数据(包括它的子类HourlyEmployee,SalariedEmployee对应的数据)。
传智播客-jpa与hibernate(1)-实体和主键生成-那一抹云-CSDN博客

传智播客-jpa与hibernate(1)-实体和主键生成-那一抹云-CSDN博客传智播客-jpa与hibernate(1)-实体和主键生成收藏jpa全称是Java Persistence API,是sun公司出台的面向数据持久化层的规范,即面向接口编程,以达到“平台”无关性(这个“平台”是指jpa产品,例如hibernate,toplink,openjpa等)。
hibernate是符合jpa规范的产品之一。
说到数据持久化,先说一下以下几点:1、对于数据持久化的思想而言,内存只是一个交换数据的地方,这意味着如果断电或者进程被杀,数据就会丢失。
2、为了防止数据丢失,所以需要将数据保存到外层(硬盘,U盘或其他存储设备等)。
3、能够实现数据持久化保存的技术就称之为数据持久化。
除了jpa,还有jdbc、io等都是。
4、应用系统里的数据持久化层是从业务逻辑层分离出来的。
关于实体:1、在jpa规范里,被托管的对象都是实体,但是是用实体名来区分实体的,如果没有显示声明,默认的实体名即不包含全路径的类名,所以如果不同包下有相同类名,应该显示声明实体名予以区分,例如@Entity(name="XXX")。
2、在jpa规范出来前,hibernate等数据持久化层技术产品早已大行其道,鱼龙混杂,jpa的出现可以说对这个市场进行了规范。
hibernate在 jpa出来前是用配置文件注册托管实体的(还有一些辅助工具帮助实现实体和表模式的相互转换,可以参见《深入浅出Hibernate》),但是jpa只支持注解方式(jpa支持配置文件方式,只是很少有人这么用,就当它没有吧。
)。
所以hibernate有两种方式注册托管实体:xml配置文件和注解。
3、如果用的jpa产品是hibernate,则在persistence.xml配置文件中不用注册实体类名也能被hibernate识别,因为hibernate有扫描机制,但是其它jpa产品不一定有,所以为了提高程序的可移植性,还是在文件中加上比较好,而且这样写也比较规范。
传智播客Hibernate课件

北京传智播客教育
—高级软件人才实作培训专家 ! Hibernate入门
9.通过id查询客户信息
北京传智播客教育
—高级软件人才实作培训专家 ! Hibernate入门
10. 查询所有的客户信息
北京传智播客教育
—高级软件人才实作培训专家 ! Hibernate入门
}
北京传智播客教育
—高级软件人才实作培训专家 ! Hibernate入门
3 创建对象-关系映射文件 Hibernate 采用 XML 格式的文件来指定对象和关系数据之间的映射. 在运行时 Hibernate 将根据这个映射文件来生成各种 SQL 语句 映射文件的扩展名为 .hbm.xml 这里Customer.hbm.xml文件
date
timestamp
BIRTHDAY
REGISTERED_TI ME
DATE
TIMESTAMP
汉语(java)
英语(hibernate)
北京传智播客教育
日语(sql)
—高级软件人才实作培训专家 ! Hibernate入门
北京传智播客教育
2 创建表和对应的javaBean文件(持久化类)
create table customer ( id int primary key, name varchar(12), age int, des text ) public class Customer { private private private private Integer id; String name; Integer age; String des;
char
boolean ng.String byte[]
character
传智播客Hibernate

—高级软件人才实作培训专家! Java对象持久化概述
软件模型
• 域模型:在软件的分析阶段创建概念模型,在
软件设计阶段创建域模型。 组成部分: 1.具有状态和行为的域对象。 2.域对象之间的关联。
北京传智播客教育
—高级软件人才实作培训专家! Java对象持久化概述
Hibernate API Hibernate配置文件
对象关系型映射
关系数据库
Customers表
北京传智播客教育
—高级软件人才实作培训专家! Hibernate入门
创建配置文件
hibernate.dialect=net.sf.hibernate.dialect.OracleDialect hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver hibernate.connection.url=jdbc:oracle:thin:peopres/peopres@127.0.0.1: 1521:oracle9 ername=peopres hibernate.connection.password=peopres hibernate.show_sql=true
北京传智播客教育
—高级软件人才实作培训专家! Hibernate入门
Hibernate初始化
•
访问Session接口
save() update() delete() load() find()
北京传智播客教育
—高级软件人才实作培训专家! Hibernate入门
—高级软件人才实作培训专家! Java对象持久化概述
应用程序的分层体系结构
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
基本概念和CURD
Java代码 代码 1.初始化代码 只做一次 初始化代码(只做一次 初始化代码 只做一次)
Configuration cfg = new Configuration(); cfg.configure(“config.cfg.xml”); 也可以通过cfg.setProperty设置属性。 SessionFactory sessionFactory = cfg.buildSessionFactory();
Criteria
Criteria是一种比HQL更面向对象的查询方式;Criteria的创建方式: Criteria crit = session.createCriteria(DomainClass.class); 简单属性条件如:criteria.add(Restrictions.eq(propertyName, value)), criteria.add(Restrictions.eqProperty(propertyName,otherPropertyName))
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
关联映射
多对一(Employee - Department) 一对多(Department-Employee) 一对一(room - door) 多对多(teacher - student) 组件映射(User-Name) 集合映射(set, list, map, bag) inverse和cascade(Employee – Department)
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
关联映射
一对一(Person 一对一(Person - IdCard) 1)基于主键的one-to-one(person的映射文件)
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家! 对象状态
瞬时(transient):数据库中没有数据与之对应,超过作用域会被JVM 垃圾回收器回收,一般是new出来且与session没有关联的对象。 持久(persistent):数据库中有数据与之对应,当前与session有关联, 并且相关联的session没有关闭,事务没有提交;持久对象状态发生 持久对象状态发生 改变,在事务提交时会影响到数据库(hibernate能检测到 。 能检测到)。 改变,在事务提交时会影响到数据库 能检测到 脱管(detached):数据库中有数据与之对应,但当前没有session与之 关联;托管对象状态发生改变,hibernate不能检测到。
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
Hibernate原理与应用
讲师: 讲师:李勇
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
主要内容
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
引入 安装配置 基本概念和CURD HQL和Criteria 关联映射 继承映射 集合映射 懒加载 缓存 事务 其他 Hibernate不适合的场景 与JPA的集成(annotation方式)
Байду номын сангаас
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
安装配置
下载地址,本教程使用3.2.5。 将下载目录/hibernate3.jar和/lib下的hibernate运行时必须的包 加入classpath中: antlr.jar,cglib.jar,asm.jar,commons-collections.jar,commonslogging.jar,jta.jar,dom4j.jar
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
关联映射
一对多(Department一对多(Department-Employee) <set name=”employees”> <key column=”depart_id”/> <one-to-many class=”Employee”/> </set>
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家! 基本功能练习
实现UserDao 实现UserDao public interface UserDao { public void saveUser(User user); public User findUserById(int id); public User findUserByName(String name); public void updateUser(User user); public void remove(User user); }
—高级软件人才实作培训专家! 高级软件人才实作培训专家! 基本概念和CURD
Session的几个主要方法 1.save,persist保存数据,persist在事务外不会产生insert语句。 2.delete,删除对象 3.update,更新对象,如果数据库中没有记录,会出现异常。 4.get,根据ID查,会立刻访问数据库。 5.Load,根据ID查,(返回的是代理,不会立即访问数据库)。 6.saveOrUpdate,merge(根据ID和version的值来确定是save或 update),调用merge你的对象还是托管的。 7.lock(把对象变成持久对象,但不会同步对象的状态)。
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
安装配置
配置文件hibernate.cfg.xml和hibernate.properties,XML和 properties两种,这两个文件的作用一样,提供一个即可,推荐 XML格式,下载目录/etc下是示例配置文件。 可以在配置文件指定: 数据库的URL、用户名、密码、JDBC驱动类、方言等。 启动时Hibernate会在CLASSPATH里找这个配置文件。 映射文件(hbm.xml,对象模型和关系模型的映射)。在/eg目录下有 完整的hibernate示例。 快速开始小例子
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家! 基本功能练习
实验步骤: 实验步骤: 1.设计domain对象User。 2.设计UserDao接口。 3.加入hibernate.jar和其依赖的包。 4.编写User.hbm.xml映射文件,可以基于hibernate/eg目录下的 org/hibernate/auction/User.hbm.xml修改。 5.编写hibernate.cfg.xml配置文件,可以基于 hibernate/etc/hibernate.cfg.xml修改;必须提供的几个参数: connection.driver_class、connection.url、ername、 connection.password、dialect、hbm2ddl.auto。 6.编写HibernateUtils类,主要用来完成Hibnerate初始化和提供一个获得 Session的方法;这步可选。 7.实现UserDao接口。
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
关联映射
多对一(Employee 多对一(Employee - Department) 映射文件<many-to-one name=”depart” column=”depart_id”/> ER图
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家! 对象状态
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家! HQL和Criteria
HQL(Hibernate Query Language)
面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类 和属性其他部分不区分大小写);HQL中查的是对象而不是和表,并且支持多态; HQL主要通过Query来操作,Query的创建方式: Query q = session.createQuery(hql); from Person from User user where =:name from User user where =:name and user.birthday < :birthday
2.模板代码 模板代码
Session session = null;Transaction tx = null; try{ session = sessionFactory.openSession(); tx = session.beginTransaction(); //…你的代码save,delete,update,get… mit(); }catch(Exception e){ if(tx !=null)tx.rollback();throw e; }finally{ if(session != null)session.close(); } 北京传智播客教育
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
基本概念和CURD
Domain Object限制 1.默认的构造方法(必须的)。 2有无意义的标示符id(主键)(可选) 3非final的,对懒加载有影响(可选) Domain Java Object(User)
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
基本概念和CURD
开发流程 1由Domain object -> mapping->db。(官方推荐) 2由DB开始,用工具生成mapping和Domain object。(使用较多) 3由映射文件开始。