一.首先来理清几个有关对象持久化的概念:
“暂时”数据,比如在电脑内存中的数据就是暂时数据,当电脑关机后,数据就消失了;“持久”数据,就像电脑硬盘上的数据,即使关机了,它还是存在。持久化的概念就是将数据从"临时"状态转换为"持久"状态,最常用的方式是使用文件来存储持久化数据。
“对象持久化”和“数据持久化”:数据持久化是对象持久化的基础,对象持久化的主要操作对象是对象里面的数据,也就是属性,当然如果属性是对象,一样要进行和母对象一样的持久化过程。现在一般将对象持久化到关系数据库中,对象之间的联系可以通过单一主键、联合主键、外键等方式得以体现。对象和关系是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据,数据库中的关系数据无法直接表达多对多关联和继承,所以需要对象-关系(ORM)系统来实现程序对象到关系数据库数据的映射,完成此种功能的软件层一般就称为持久化层。
如上面结构所示,Hibernate体系结构就是来完成数据持久化与反持久化的功能的,连接数据可和应用程序,把应用程序中的对象和对象之间的关系持久化到数据库中以二维关系表示,反之一样。Hibernat是通过配置文件和映射文件来为应用层和数据库层提供持久化服务的。
二.下面是是Hibernate中对象持久化的具体内容和方式
1.持久化类:用来实现业务问题实体的类就是持久化类,他需要满足这些规则:
* 实现一个默认的(无参)构造方法
* 提供一个标识属性
* 使用非final类型的类
* 为持久化字段声明访问方法和是否可变的标志
2.Hibernate对象状态
![【Hibernate开发】对持久化对象和缓存机制的理解 【Hibernate开发】对持久化对象和缓存机制的理解](https://i-blog.csdnimg.cn/blog_migrate/c6a711eb8043403cf0d7c1cc688e6824.jpeg)
Hibernate对象具有三种状态:瞬时状态、持久化状态、游离状态,三者的关系如上图所示。瞬时变量就是刚刚new出来后还没有与任何session相关联的状态;持久变量就是刚被sava()或load()的对象,它还在session的范围内,session没有关闭,这是该对象和数据库中的记录保持一致,只要session关闭,就会把内存中的对象的最信息更新到数据库中对应的记录里;游离状态就是就是对象曾经被session持久化过,现在对应的session已经关闭了,但是这样的变量还能被新得到的session持久化,他的特点就是带有持久化标识符。
三.Session方法简介
Session中方法可以改变对象的状态,这个可以参考上图,里面的方法一定要理解。
* save():是瞬时变量持久化
* load()和get():根据某个对象的持久化标识符来获取该对象。每个方法中有两个参数,指明要加载对象的class属性和持久化标志符。load()会报空异常,get()直接返回null。
* update():使托管对象持久化。持久化对象的更新与同步不需人工操作,session的刷新机制就可以完成。
* saveOrUpdate():既能保存瞬时对象又可更新/重新关联托管对象。对象状态为瞬时就执行save()方法,为脱管状态就执行update()方法。
* delete():从数据库中一出与对象相对应的记录。删除持久对象和脱管对象(先与session关联),变为瞬时变量。
* evict():从缓存中删除一个持久变量,,使他变为脱管状态。
* close():关闭session,缓存中的所有持久对象变为脱管对象。
四.Hibernate缓存机制
这里可以参考百度百科Hibernate缓存机制
Hibernate采用两级缓存机制,第一层是Session级的缓存,第二级是SessionFactory级别的缓存。
Session级缓存:为内置缓存,无法卸载,他是一些集合属性包含的数据,是保存应用程序所需要的一些配置、对象等信息,是应用程序级的缓存。
SessionFactory缓存:Hibernate的第二级缓存,包括内置缓存和外置缓存。内置缓存和session级缓存在实现刚发上很相似。内置缓存是只读的,应用程序不能修改,不需要进行内置缓存与映射文件的同步,他保存的是Hibernate底层需要的一些配置、映射、SQL语句等信息都是公共级的;外置缓存是一个可配置的插件,它存储的数据是数据库数据的拷贝,外置缓存的介质可以是内存或硬盘。
五.最后我加一点,这一点长期被面试官问到:Hibernate和JDBC的异同?
JDBC与Hibernate在性能上相比,JDBC灵活性有优势。而Hibernate在易学性,易用性上有些优势。当用到很多复杂的多表联查和复杂的数据库操作时,JDBC有优势。可见《hibernate与jdbc的优缺点》
相同点:1两者都是java的数据库操作中的中间件
2.两者对于数据库进行直接操作的对象都不是线程安全的,都需要及时关闭。
3.两者都可以对数据库的更新操作进行显示的事务处理。
不同点:1.使用的SQL语言不同:JDBC使用的是基于关系型数据库的标准SQL语言,Hibernate使用的是HQL语言。
2.操作的对象不同:JDBC操作的是数据将数据通过SQL语句直接传送到数据库中执行,Hibernate操作的是持久化数据,由Hibernate底层将持久化对象中的数据更新到数据库中。
3.数据状态不同:JDBC操作的数据是“瞬时”的,变量的值无法与数据库中的值保持一致,而Hibernate操作的数据是可持久化的,即持久化对象的数据属性的值是可以跟数据库中的值保持一致的。