Hibernate入门
一:Hibernate框架简介
(1.)Hibernate框架:是数据持久化工具,也是一个开放源代码的ORM解决方案。Hibernate内部封装的了通过JDBC访问数据库的操作,向上层应用提供面向对象的数据访问API。
(2.)Hibernate是ORM解决方案。
(3.)Hibernate框架的优点:
1.Hibernate功能强大,是JAVA应用与关系数据库之间的桥梁,较之JDBC方式操作数据库,代码量大大减少,提高了持久化代码的开发速度,降低了维护成本。
2.Hibernate支持许多面向对象的特性,如组合,继承,多态,使得开发人员不必在面向业务领域的对象模型和面向数据库的关系数据之间的模型切换,方便开发人员进行领域驱动的面向对象的设计与开发。
3.可移植性好,
4.框架开源免费
缺点:
1. 不适合以数据为中心大量使用存储过程的应用。
2. 大规模的批量插入,修改和删除不适合用Hibernate。
(4.)Hibernate和Mybatis的比较:
1.相对于Mybatis的‘SQL-Mapping’的ORM实现,Hibernate的ORM实现更加完善,提供了对象状态管理功能。Hibernate是对数据库操作,针对的是JAVA对象,即使使用Hibernated查询语言,其书写规则也是面向对象的。
2.Hibernate与具体数据库的关系只需要在XML中配置即可,hibernate开发者不需要关注SQL的生成与结果的映射,所有的HQL语句与具体的数据库无关,便于修改,移植性好。而Mybatis直接使用SQL语句,不同数据库可能会有差异,修改工作量大,可移植性差。
3.由于直接使用SQL语句,所有MyBtais的使用灵活性高,而Hibernate对于关系模型设计不合理,不规范系统不适用。在不考虑缓存的情况下,MyBatis执行效率也比较Hibernate高一些。
二:Hibernate环境搭建:
(1.)Hibernate环境搭建:
1.下载需要的jar文件:Hibernate官方网站是:http://hibernate.org。托管网站是:https://sourceforge.net/projects/hibernate/files/下载。推荐下载hibernate3。
2.部属jar文件
3.创建Hibernate配置文件hibernate.cfg.xml。
4.创建持久化类和映射关系文件。
(2.)主键生成策略:
1.Assigned:主键由程序负责生成,
2.Increment:对类型为long,short或者int的主键,以自动生长方式生成主键的值,主键按数值顺序递增,增长量为1。
3.Identity:对如,SQL server,DB2 ,MySQL等支持表识列的数据库,可使用该主键的值生成策略生成自动增长主键,但在数据库中将相应的主键字段设置为表识列。
4.sequence:对如Oracle Db2等支持序列的数据库,可使用主键生成策略生成自动曾增长主键,通过子元素param可传入数据库中序列的名称。
5.Native:由Hibernate根据底层数据库自行判断采用何种主键生成策略,即由使用数据库生成主键的值。
三:使用Hibernate完成持久化操作
(1.)读取并解析配置文件及映射文件。
Configuration conf=new Configuration().configure();
(2.)依据配置文件和映射文件中的信息,创建SessionFactory对象。
SessionFactory sf=conf.buildSessionFactory();
(3.)打开Session
Session session =sf.getCurrentSession();//或者使用:sf.openSession();
(4.)开始一个事务
Transaction tx=session.benginTransaction();
(5.)数据库操作
Session.save(user);//保存操作
(6.)结束事务
Tx.commit();//提交事务
或
Tx.rollback();//会滚事务
(7.)如果通过SessionFactory的openSession()方法获取的Session对象,则需要关闭session。
Session.close();
8.get()和load()区别:当使用Session的get()方法时,如果加载的数据库不存在,get()方法会返回一个null;但是使用load()方法,若加载的数据库不存在,则会抛出异常。这是get()和load()方法的区别之一。
四:Hibernate中java对象的三种状态
1.Java对象的三种状态
(1.)顺时状态(Transient)又称(临时状态)
(2.)持久状态(Persistent):当对象与Session 关联,被Session管理时,它就处于持久状态。
(3.)游离状态(Detached)又称(托管状态)
2.三种状态的转换
(1.)瞬时状态转换持久状态
使用Session的save(),saveOrUpdate()等方法保存对象后。
或
Session的get()或load方法获取对象。
(2.)持久状态转换为瞬时状态
执行Session的delete()方法后。
(3.)持久状态转换为游离状态
执行Session的evict(),clear()或close方法。
(4.)游离转换为持久状态
Session 的update()或saveOrUpdate()方法。
(5.)游离状态转换为瞬时状态
Session的delete()方法
五:脏检测及刷新缓存机制
(1.) 脏检测:在Hibernate中,数据前后发生的变化对象,称为脏对象。
(2.)刷新缓存机制:当Session缓存中对象的属性发生变化时,Session并不会立即执行脏检查和执行相关的SQL语句,而是在特定的时间点,即刷新缓存时才执行。
Session 会在一下时间点刷新缓存
(1.)应用程序显示调用Session 的flush()方法时。
Session的flush()方法进行刷新缓存操作,会触发脏检查,视情况执行相关的SQL语句。
(2.)应用程序调用Transaction 的commit()方法时。
Commit()方法先调用Session 的刷新缓存方法flush(),然后向数据库提交事务。
六:跟新数据的方法
(1.)update()方法,用于将游离状态恢复为持久状态,同时进行数据库更新操作,当参数对象OID为Null时会报异常。
(2.)saveOrUpdate()方法,同时包含了save()与update()方法的功能,如果入参是瞬时状态的对象,就调用save ()方法,如果入参是游离状态的对象,则调用update()方法。
(3.)merge()方法,能够作为参数传入的游离状态对象的属性复制到一个拥有相同OID的持久状态对象中,通过持久状态的脏检查实现跟新操作,并返回该持久状态对象,如果无法从Session缓存或数据库中加载到相应的持久状态对象,即传入瞬时对象,则创建其副本执行插入操作,并返回这一新的持久状态对象。
Hibernate关联映射
一:关联关系
- 从一个表到另一个表的关联就称为:单向关联
如果同时包含两种表就称:为双向关联
*映射关系如下:
多对一单向关联关系
一对多双向关联关系
多对多关联关系
- 持久化操作:保存
Public class EmpDao extends BaseDao{
Public void save(Emp emp){
This.currentSession().save(emp);//省略其它代码
}
}
- 建立双向一对多关联关系:
列如:给定Emp对象,如果想获得与它关联的Dept对象:如下
Dept dept=emp.getDept();//从Emo对象导航到关联的Dept对象
4.<set>元素:还包含了其它两个元素:
<key>元素:column属性设定与所关联的持久化类相对应的表外键,此处表的DEPTNO字段
<one-to-many>元素:Class属性设定关联的持久化类型,此处为Emp 类Hibernate根据以上映射代码可活动以下信息。
- 双向关联关系下的增删该操作
级联操作可以为持久化映射文件中通过cascade属性和inverse属性进行控制。
5.<set>元素的inverse属性
<set>属性的inverse属性的值有两个,即true和false默认是false,关系关联中,inverse=”false”的伪主动方,主动方负责维护关联关系。
二:加载
- 立即加载:
在xml文件中。
<class name=”文件路径全名” lazy=”false” table=”对象名”>
以下代码表明Dept类的emps集合采用立即加载策略
<set name=”emps” inverse=”true” lazy=”false”>….</set>
- 延迟加载:
默认加载:<class name=”文件全名” lazy=”true” table=”对象名”>
对于<set>元素,应该优先考虑使用默认的延迟加载策略
<set name=”emps” inverse=”true”>…..</set>
- 增强延迟加载:
<set name=”emps” inverse=”true” lazy=”extra”>….</set>