各位码友大家好,最近学习了开源框架hibernate,真心感觉太有用了,可是鄙人一向资质平平,深层次的还没理解,只盼来日开天眼,一眼看透hibernate,同时也请大家多多的指点指点,闲言少叙,言归正传:
1.为什么有hibernate:
先假设没有hibernate和其他类似开源框架会怎么样?我们一遍又一遍的使用jdbc ,造成代码冗余,jdbc是直接面向数据库操作,对象属性和表中的字段之间的转换全都交给代码开发者,效率低下,这你感觉好吗?而hibernate是一个开放源代码的对象关系映射框架,它对jdbc进行了非常轻量级的对象封装,使得java程序员可以随意的使用面向对象编程的思想来操纵数据库。hibernate不仅管理java类到数据库表的映射,还提供数据查询和获取数据的方法,可以大幅减少开发时人工使用sql和jdbc处理数据的时间。
2.创建实体类应注意的问题:
为了通过反射机制来实例化类的对象,我们需要提供一个无参的构造器,所有的实体类都要求有无参的构造器,因为Hibernate需要使用Java反射机制来为你创建对象。
为实体类实现Java.io.Serializable 接口,以便Hibernate能更好的缓存实体对象。
3.主配置文件的配置与创建:
- 数据库连接信息
- 方言以及各种数据库信息
- 连接池相关配置
- 映射文件路径
主配置文件代码
4.hibernate映射:
对象和关系数据库之间的映射是用一个xml文档来定义的。
三种映射关系:类与表的映射
属性与主键的映射
属性与普通字段的映射
映射文件的配置与创建:
关联映射:
- many-to-one: many的一端应持有one的一端的对象(引用),映射文件体现多对一,关联操作
<column name="seeker_id"></column> 2
</many-to-one>
1、name为属性名,class为“one”端类名
2、外键列列名
- one-to-many:one的一端应持有many端的对象集合,映射文件体现一对多,关联操作
<key column="seeker_id"></key> 2
<one-to-many class="org.ijob.bean.Resume"/> 3
</set>
1、set集合节点适用于配置一对多关联关系, name属性指定one的一端对应属性名。
2、外键列列名。
3、class属性指定many端的全限定类名。
- many to many:将多对多转换成两个一对多,为中间表建立实体类及映射文件,两个端点和中间端分别建立双向一对多关联
<composite-id>
<key-many-to-one name=“**” column=“***" class=“***" ></key-many-to-one>
<key-many-to-one name=“**” column=“**" class=“**" ></key-many-to-one>
</composite-id>
主键生成策略:
increment:类似于数据表中的自增列,往数据库插入一个新的实体对象时,其标识符(主键)为上一次插入对象的标识符加1。
identity:每次新增对象时,调用数据库本身的“identity”生成器产生标识符。
sequence:每次新增对象时,调用数据库的sequence对象产生标识符。
配置举例:
<generator class="sequence" >
<param name="sequence">sequence_name</param><!--sequence对象的名字 -->
</generator>
这样配置之后,每次往数据库中插入新对象,都调用数据库的“sequence_name”所指定的sequence对象来产生其标识符。
uuid:每次新增对象时,用一个128-bit的UUID算法生成长度为32的字符串类型的标识符。这是本书实际采用的主键生成方式。
assigned:不提供主键自动生成支持,而是让应用程序在save()之前手动为对象分配一个标识符,这是没有<generator>元素时的默认生成策略。
5.数据库操作七步法:
6.hibernate主要接口:
- Configuration
- Sessionfactory
- Session
- Transcation
- Query
7.hibernate中实体对象三种状态及转换:
瞬时状态(Transient)
持久态(persisent)
游离态(Detached)
new产生的对象—瞬时态
通过save saveOrUpdate方法转换为持久态,通过delete方法可以将对象变回瞬时态
session关闭之后,原有的持久态就变成了游离态,游离态通过系列方法可重新回到持久态,并在事务提交的时候和数据库同步
session的get load方法可直接获得一个持久态对象。
持久态和游离态的共同点在于,都有数据表的一行与之对应,不同的是,持久态在session范围内,而游离态不在session范围内。
8.使用session.fiush()的使用:
9.hibernate中的延迟加载问题:
hibernate默认启用延迟加载,关联的对象和集合不会随着主体对像的加载而加载,只有在需要的时候才去加载,此时加载的只是关联对象或集合的代理,用时给予初始化。
解决延迟加载的办法:
- 暂时不关闭session
- Hibernate.initialize();//强制初始化关联集合或关联对象
- HQL中的热抓取fetch join
10.HQL
是一种面向对象的查询语言,其中没有表和字段的概念,只有类、对象和属性的概念 。HQL看上去很像SQL,但是我们不要被语法结构上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询。
- 得到session
- hql语句的编写
- 创建Query对象 Query接口是HQL查询接口
- 执行查询得到结果
这里只是各个重要知识点的罗列,关于hibernate的内在机制,需在以后的学习工作中慢慢研究,只有深入理解了hibernate内在,才能更好地利用hibernate框架。