Hibernate相关知识
1. Hibernate的基本操作
a) Hibernate的作用
i. 映射:hibernate是开源的ORM(Object-Relational Mapping)对象关系映射框架。它通过配置文件(hibernate.properties或hibernate.cfg.xml)和映射文件(***.hbm.xml)把JAVA对象或PO(Persistent Object,持久化对象)映射到数据库中的数据库,然后通过操作PO,对数据表中的数据进行增,删,改,查等操作
ii. 持久化:hibernate是一个持久层框架。主要应用是将内存中的对象存储在关系型的数据库中。
b) Hibernate的核心组件
从上图中,我们可以看出Hibernate六大核心接口,两个主要配置文件,以及他们直接的关系。
1、Configuration接口:用来读取Hibernate配置文件,并生成SessionFactory对象。
2、SessionFactory接口:负责初始化Hibernate。它是生成Session的工厂
3、Session接口:负责持久化对象的CRUD(Create,Update,Retrieve,Delete)操作。是Transaction 的工厂,Session对象有一个一级缓存,现实执行Flush之前,所有的持久化操作的数据都在缓存中Session对象处。
4、Transaction接口:负责事务。用来管理Hibernate事务,它主要方法有commit()和rollback(),可以从Session的beginTransaction()方法生成。
5、Query接口:用来对PO进行查询操作。它可以从Session的createQuery()方法生成
注意:Configuration实例是一个启动期间的对象,一旦SessionFactory创建完成它就被丢弃了。
i. 瞬时态(Transient):也叫临时状态,应用程序中刚new的对象,对象无OID(Object id),没有和session管理,数据库中也没有对应的记录。
ii. 持久态(Persistent):数据库中存在该记录,并且该记录在session已经和对象进行关联,对象有OID,这种类型的对象是持久化对象,处于持久态的对象,如果在session没有关闭之前进行了修改,该修改会自动同步到数据库中去。
iii. 托管态(detached):也叫游离状态,一个对象从数据库中查询出来,session已经关闭,这个时候该对象存在OID(或者说在数据库中有对于记录),但是已经没有session可以管理它了,这种类型的对象叫做托管态对象。
iv.
对以上图形的解析:
1、当一个对象被new了以后此对象处于瞬时态(Transient);
2、然后对此对象执行session的save() 或者saveOrUpdate()方法后,此对象被放入session的一级缓存进入持久态.
3、当再对此对象执行evict()/close()/clear()的操作后此对象进入托管态(Detached)
4、托管态(Detached)和瞬时态(Transient)的对象由于没有被session管理会在适当的时机被java的垃圾回收站(garbage)回收.
5、执行session的get()/load()/find()/iternte()等方法从数据库里查询的到的对象,处于持久态(Persistent).
6、当对数据库中的纪录进行update()/saveOrUpdate()/lock()操作后托管态的对象就过渡到持久态
7、处于持久态(Persistent)与托管态(Detached)的对象在数据库中都有对应的记录.
8、瞬时态(Transient)与托管态(Detached)的对象都可以被回收可是瞬时态的对象在数据库中没有对应的纪录,而托管态的对象在数据库中有对用的纪录。
d) Hibernate中session的常用方法
i. get()方法:get不支持延迟加载,执行get方法之后,马上发出sql语句;get方法要查询的数据在数据库不存在的情况下,返回null;get返回的是真实对象
ii. load()方法:load方法默认情况下是延迟加载,在对象被首次使用的时候才发出sql语句。如果让load方法马上发出sql语句,则需要修改hbm.xml配置。load方法在数据库不存的情况下抛出异常;load返回的是代理对象
iii. save()方法:save使一个临时对象转变为持久化对象。))计划执行一条 insert 语句。
iv. update()方法:update使一个托管对象转变为持久化对象, 并且计划执行一条 update 语句.
v. saveOrUpdate()方法: saveOrUpdate同时包含save和update方法,如果参数是临时对象就用save方法,如果是托管对象就用update方法,如果是持久化对象就直接返回。(如果数据库中有对于id的数据,则执行update;如果没有则执行save)。
vi. delete()方法:delete用来删除持久化对象和瞬时对象,如果传入的对象是持久化数据,那么当清理缓存时,执行delete操作。如果传入的对象是瞬时对象,那么首先会将该对象与session相关联,然后当清理缓存时,再执行delete语句。(delete可以按照id进行删除,待删除对象可以是瞬时态也可以持久态)。
vii. 修改删除的sql都是在事务提交的时候发出的。
e) Hibernate的缓存机制
i. Hibernate的缓存包括Session的缓存和SessionFactory的缓存。
ii. Session的缓存是内置的,不能被卸载,被称为Hibernate的第一级缓存。
1. 一级缓存默认打开,无法取消。Hibernate每次在get,load数据的时候都会以map的形式将查询到的数据放到session缓存中。Session关闭的时候自动刷新以及缓存。一级缓存中的内容在整个session级别共享。
iii. SessionFactory的缓存又可以分为两类:内置缓存和外置缓存,SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句,映射元数据是映射文件中数据的拷贝,SessionFactory不需要进行内置缓存与映射文件的同步。SessionFactory的外置缓存是一个可配置的插件,SessionFactory的外置缓存也被称为Hibernate的第二级缓存。
iv. SessionFactory的内置缓存和Session的缓存在实现方式上比较相似,前者是SessionFactory对象的一些集合属性包含的数据,后者是指Session的一些集合属性包含的数据,