Hibernatenew完整版.docx
- 文档编号:5422075
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:22
- 大小:52.39KB
Hibernatenew完整版.docx
《Hibernatenew完整版.docx》由会员分享,可在线阅读,更多相关《Hibernatenew完整版.docx(22页珍藏版)》请在冰豆网上搜索。
Hibernatenew完整版
课程内容
1.HelloWorld
a)xml
b)annotation
2.Hibernate原理模拟–什么是O/RMapping以及为什么要有O/RMapping
3.常见的O/R框架(了解)
4.hibernate基础配置(重点)
5.ID生成策略(重点掌握AUTO)
6.Hibernate核心开发接口介绍(重点)
7.对象的三种状态(了解)
8.关系映射(重点)
9.Hibernate查询(HQL)
10.在Struts基础上继续完善BBS2009
11.性能优化(重点)
12.补充话题
风格
1.先脉络,后细节
2.先操作,后原理
3.重Annotation,轻xml配置文件
a)JPA
b)hibernate-extension
资源
1.http:
//www.hibernate.org
2.hibernatezh_CN文档
3.hibernateannotationreferences
环境准备
1.下载hibernate3.3.2
2.下载hibernate3.4.0
3.注意阅读hibernatecompatibilitymatrix(hibernate网站,download)
4.下载slf4j1.5.8
HibernateHelloWorld
1.建立新的java项目,名为:
hibernate_0100_HelloWorld
2.学习建立User-library–hibernate,并加入相应的jar包
a)项目右键-buildpath-configurebuildpath-addlibrary
b)选择User-library,在其中新建libraray,命名为hibernate
c)在该library中加入hibernate所需jar包
i.hibernatecore
ii./required
iii.slf-nopjar
3.引入mysql的JDBC驱动包
4.在mysql中建立对应的数据库以及表
a)createdatabasehibernate;
b)usehibernate;
c)createtableStudent(idintprimarykey,namevarchar(20),ageint);
5.建立hibernate配置文件hibernate.cfg.xml
a)从参考文档中copy
b)修改对应的数据库连接
c)注释掉暂时用不上的内容
6.建立Student类
7.建立Student映射文件Student.hbm.xml
a)参考文档
8.将映射文件加入到hibernate.cfg.xml中
a)参考文档
9.写测试类Main,在Main中对Student对象进行直接的存储测试
a)参考文档
10.FAQ:
a)要调用newConfiguration().configure().buildSessionFactory(),而不是省略configure,否则会出hibernatedialectmustbeset的异常
11.Note:
a)请务必建立自己动手查文档的能力
b)重要的是:
i.要建立自己动手查一手文档的信心
ii.还有建立自己动手查一手文档的习惯!
iii.主动学习,放弃被动接受灌输的习惯!
12.建立能力:
a)错误读完整
b)读出错误的关键行
c)排除法
d)比较法
e)google老师
建立Annotation版本的HelloWorld
1.创建teacher表,createtableteacher(idintprimarykey,namevarhcar(20),titlevarchar(10));
2.创建Teacher类
3.在hibernatelib中加入annotation的jar包
a)hibernateannotaionjar
b)ejb3persistencejar
c)hibernatecommonannotationsjar
d)注意文档中没有提到hibernate-common-annotations.jar文件
4.参考Annotaion文档建立对应的注解
5.在hibernate.cfg.xml中建立映射
6.参考文档进行测试(注意文档中缺少configure()的小bug)
7.FAQ:
@不给提示
a)contentassist–activation–加上@
WhatisandWhyO/RMapping
1.JDBC操作数据库很繁琐
2.Sql语句编写并不是面向对象的
3.可以在对象和关系表之间建立关联来简化编程
4.O/RMapping简化编程
5.O/RMapping跨越数据库平台
6.Hibernate_0200_OR_Mapping_Simulation
O/RMappingFrameworks
1.hibernate
2.toplink
3.jdo
4.JPA
a)意愿统一天下
Hibernate基础配置
1.对应项目:
Hibernate_0300_BasicConfiguration
2.介绍MySQL的图形化客户端
3.hibernate.cfg.xml:
hbm2ddl.auto
a)先建表还是先建实体类
4.搭建日志环境并配置显示DDL语句
a)slf4j与log4j的关系:
slf4j像是一个大管家,可以管理许多的日志框架,log4j是其中之一
b)加入sl4j-log4j.jar,加入log4j的jar包,去掉slf4j-nop-jar
c)从hibernate/project/etc目录copylog4j.properties
d)查询hibernate文档,日志部分,调整日志的输出策略
e)
5.搭建JUnit环境
a)需要注意JUnit的Bug
6.hibernate.cfg.xml:
show_sql
7.hibernate.cfg.xml:
format_sql
8.表名和类名不同,对表名进行配置
a)Annotation:
@Table
b)xml:
自己查询
9.字段名和属性相同
a)默认为@Basic
b)xml中不用写column
10.字段名和属性名不同
a)Annotation:
@Column
b)xml:
自己查询
11.不需要psersistence的字段
a)Annotation:
@Transient
b)xml不写
12.映射日期与时间类型,指定时间精度
a)Annotation:
@Temporal
b)xml:
指定type
13.映射枚举类型
a)@Enumerated
b)xml:
麻烦
14.字段映射的位置(field或者get方法)
a)bestpractice:
保持field和getset方法的一致
15.@Lob
16.课外:
CLOBBLOB类型的数据存取
17.课外:
Hibernate自定义数据类型
18.hibernate类型
a)
ID生成策略
1.对应项目:
hibernate_0400_ID
2.注意:
a)我们观察hibernate生成表的结构并不是为了将来就用它生成,(可能还有自己的扩展,比如index等)而是为了明白我们应该建立什么样的表和实体类映射
3.xml生成id
a)generator
b)常用四个:
nativeidentitysequenceuuid
4.@GeneratedValue
a)自定义ID
b)AUTO
i.默认:
对MySQL,使用auto_increment
ii.对Oracle使用hibernate_sequence(名称固定)
c)IDENTITY
d)SEQUENCE
i.@SequenceGenerator
e)TABLE(可以忘记)
i.@TableGenerator
5.FAQ:
a)用Junit测试时HibernateSessionFactory初始化异常不提示。
疑似一个bug
b)用main来做测试
6.联合主键
a)xml:
composite-id
i.为什么要重写equals和hashCode
ii.为什么要实现serializable
b)Annotation
i.@Embeddable@Id
ii.@EmbeddedID(*)
iii.@Id@IdClass(*)
核心开发接口介绍
1.hibernate_0500_CoreAPI
2.HibernateAPI文档需要单独下载
3.Configuration
a)AnnotationConfiguration
b)进行配置信息的管理
c)用来产生SessionFactory
d)可以在configure方法中指定hibernate配置文件
e)只需关注一个方法即:
buildSessionFactory()
4.SessoinFactory
a)用来产生和管理Session
b)通常情况下每个应用只需要一个SessionFactory
c)除非要访问多个数据库的情况
d)关注两个方法即:
openSessiongetCurrentSession
i.opensession每次都是新的,需要close
ii.getCurrentSession从上下文找,如果有,用旧的,如果没有,建新的
1.用途,界定事务边界
2.事务提交自动close
3.current-session_context_class(jtathread)(javatransactionapi)
a)thread使用connection
5.Session
a)管理一个数据库的任务单元
b)方法(CRUD)
i.save()
ii.delete
iii.load
iv.get
v.get与load的区别
1.不存在对应记录时表现不一样
2.load返回的是代理对象,等到真正用到对象的内容时才发出sql语句
3.get直接从数据库加载,不会延迟
vi.update
1.用来更新detached对象,更新完成后转为persistent状态
2.更新transient对象会报错
3.更新自己设定id的transient对象可以(数据库有对应记录)
4.p状态的对象只要设定不同字段就会发生更新
5.更新部分更改的字段
a)xml设定property标签的update属性,annotation设定@Column的updatable属性,不过这种方式很少用,因为不灵活
b)使用xml中的dynamic-update,JPA1.0Annotation没有对应的属性,hibernate扩展?
i.同一个session可以,跨session不行,不过可以用merge()(不重要)
c)使用HQL(EJBQL)(建议)
vii.saveOrUpdate()
viii.clear方法
1.无论是load还是get,都会首先查找缓存(一级缓存),如果没有,才会去数据库查找,调用clear()方法可以强制清除session缓存
ix.flush()方法
1.可以强制进行从内存到数据库的同步!
2.FlushMode
x.find方法已经过时!
6.SchemaExport
7.Query接口
a)参考Hibernate查询(HQLEJBQL)的内容
8.Note:
a)Hibernate中涉及很多非常非常细节的区别,但在实际应用中用得极少,请大家先享受写项目的乐趣,再来探讨这些细节问题
i.比如save和persist的区别
ii.merge、evict等方法
iii.比如refresh、lock等
b)建议的学习方法,动手实验
c)细节问题参考补充视频
三种对象状态
1.上一个project
2.三种状态的区分关键在于
a)有没有ID,
b)ID在数据库中有没有
c)在内存中有没有(session缓存)
3.三种状态:
a)transient:
内存中一个对象,没ID,缓存中也没有
b)persistent:
内存中有,缓存中有,数据库有(ID)
c)detached:
内存有,缓存没有,数据库有,ID
4.对这三种状态需要关注的问题是在该状态下如果进行数据库的操作会发生什么结果,比如改变属性的值会不会发出update语句?
a)强烈建议动手实验
b)进行正常人的思考
c)绝对不要去背这些东西!
背过也并不代表你有多牛!
关系映射
对象之间的关系
1.这里的关系映射指的是对象之间的关系,并不是指数据库的关系,本章解决的问题是当对象之间处于下列关系之一时,数据库表该如何映射,编程上该如何对待(红色为重点)
2.简化问题:
a)怎么写Annotation
b)增删改查CRUD怎么写
3.一对一
a)单向(主键、外键)
b)双向(主键、外键)
c)中间表
4.一对多
a)单向
b)双向
5.多对一
a)单向
b)双向
6.多对多
a)单向
b)双向
7.集合映射
a)List
b)Set
c)Map
8.继承关系(不重要)
a)单表
b)多表
c)一张主表,多张子表
9.组件映射
a)@Embeddable
b)@Embedded
一对一关联
1.一对一单向外键关联
a)项目名称:
hibernate_0600_one2one_uni_fk
b)Annotation:
@One2One@JoinColumn
c)xml:
2.一对一双向外键关联 a)项目名称: hibernate_0700_one2one_bi_fk b)Annotation: @One2One(mappedBy) c)xml: d)规律: 凡是双向关联,必设mappedBy 3.一对一单向主键关联(不重要) a)项目名称: hibernate_0800_one2one_uni_pk b)@PrimaryKeyJoinColumn c)xml: 4.一对一双向主键关联(不重要) a)项目名称: hibernate_0900_one2one_bi_pk b)@PrimaryKeyJoinColumn c)xml: 5.联合主键 a)项目名称: hibernate_1000_one2one_uni_fk_composite b)@JoinColumns 组件映射 1.项目: hibernate_1100_component 2.对象关系: 一个对象是另外一个对象的一部分 3.数据库表: 一张表 4.annotation: @Embbedable@Embbeded 5.xml: 多对一与一对多 1.多对一单向关联 a)项目名称: hibernate_1200_many2one_uni b)数据库表设计: 在多方加外键 i.错误做法: 在一方加冗余 perosnid personname dreamid 1 zhangsan 1 1 zhangsan 2 dreamid dreamdescr 1 earnmoney 2 eatalot c)annotaion: @Many2One d)xml: 2.一对多单向关联 a)项目名称: b)类: 在一的一方存在多方的集合 c)数据库表同上 d)annotation: @One2Many e)xml: 3.一对多(多对一)双向关联 4.在车中持有人的引用 5.hibernate_0900_many2one_1 6.结论: 不要设置cascade 1.例如: 一个人可以拥有多辆车,人中包含车的列表 2.hibernate_0800_one2many_1 3.@One2Many 4.默认在集合上的fetch为LAZY 多对多 1.单向关联: a)项目: hibernate_1500_many2many_uni b)例如: 老师和学生的关系,老师需要直到自己教了哪些学生 c)数据库: 中间表 d)@Many2Many e) 2.双向关联: a)项目: hibernate_1600_many2many_bi b)老师知道自己教了哪些学生,学生也知道教自己的有哪些老师 关联关系中的CRUD_Cascade_Fetch 1.hibernate_1700_one2many_many2one_bi_crud 2.设定cascade可以设定在持久化时对于关联对象的操作(CUD,R归Fetch管) 3.cascade仅仅是帮我们省了编程的麻烦而已,不要把它的作用看的太大 a)Cascade的属性指明做什么操作的时候关联对象是绑在一起的 b)refresh=A里面需要读B改过之后的数据 4.铁律: 双向关系在程序中要设定双向关联 5.铁律: 双向mappedBy 6.fetch a)铁律: 双向不要两边设置Eager(会有多余的查询语句发出) b)对多方设置fetch的时候要谨慎,结合具体应用,一般用Lazy不用eager,特殊情况(多方数量不多的时候可以考虑,提高效率的时候可以考虑) 7.O/RMapping编程模型 a)映射模型 i.jpaannotation ii.hibernateannotationextension iii.hibernatexml iv.jpaxml b)编程接口 i.jpa ii.hibernate c)数据查询语言 i.HQL ii.EJBQL(JPQL) 8.要想删除或者更新,先做load,除了精确知道ID之外 9.如果想消除关联关系,先设定关系为null,再删除对应记录,如果不删记录,该记录就变成垃圾数据 10.练习: 多对多的CRUD a) teacher student t1 s1 t1 s2 t2 s1 t2 s2 关系映射总结 1.什么样的关系,设计什么样的表,进行什么样的映射 2.CRUD,按照自然的理解即可(动手测试) 集合映射(不太重要) 1.项目名称: hibernate_1800_Collections_Mapping 2.Set 3.List a)@OrderBy 4.Map a)@Mapkey 继承映射(不太重要) 1.三种方式 a)一张总表SINGLE_TABLE i.hibernate_1900_Inheritence_Mapping_Single_Table b)每个类分别一张表TABLE_PER_CLASS i.hibernate_2000_Inheritence_Mapping_Table_Per_Class c)每个子类一张表JOINED i.hibernate_2100_Inheritence_Mapping_JOINED 作业: 1.学生、课程、分数的设计(重要) a)使用联合主键@EmbeddedId i.实现Serializable接口 b)不使用联合主键 2.设计: a)实体类(表) b)导航(编程方便) c)确定了编程方式 3.树状结构的设计(至关重要) a)在同一个类中使用One2Many和Many2One Hibernate查询(QueryLanguage) HQLvsEJBQL 1.NativeSQL>HQL>EJBQL(JPQL1.0)>QBC(QueryByCriteria)>QBE(QueryByExample) 2.总结: QL应该和导航关系结合,共同为查询提供服务。 性能优化 1.注意session.clear()的运用,尤其在不断分页循环的时候 a)在一个大集合中进行遍历,遍历msg,取出其中的含有敏感字样的对象 b)另外一种形式的内存泄露//面试题: Java有内存泄漏吗? 2.1+N问题//典型的面试题 a)Lazy b)BatchSize c)joinfetch 3.list和iterate不同之处(//主要为了面试) a)list取所有 b)iterate先取ID,等用到的时候再根据ID来取对象 c)session中list第二次发出,仍会到数据库查询 d)iterate第二次,首先找session级缓存 4.一级缓存和二级缓存和查询缓存(面试题) a)什么是缓存 b)什么是一级缓存,session级别的缓存 c)什么是二级缓存,SessionFactory级别的缓存,可以跨越session存在 i.经常被访问 ii.改动不大不会经常改动 iii.数量有限 d)打开二级缓存 i.hibernate.cfg.xml设定: ii.@Cache注解 e)load默认使用二级缓存,iterate默认使用二级缓存 f)list默认往二级缓存加数据,但是查询的时候不使用 g)如果要query用二级缓存,需打开查询缓存 i. ii.调用Query的setCachable(true)方法指明使用二级缓存 h)缓存算法: (纯为了面试) i.LRU、LFU、FIFO 1.LeastRecentlyUsed 2.LeastFrequentlyUsed(命中率高低) 3.FirstInFirstOut ii.memoryStoreEvictionPolicy="LRU"(ehcache)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Hibernatenew 完整版