Hibernate的核心组件,三种状态,常用方法和缓存机制

来源:互联网 发布:exe文件加密网络授权 编辑:程序博客网 时间:2024/05/29 07:10

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创建完成它就被丢弃了。


c)       Hibernate中对象的三种状态

                     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的一些集合属性包含的数据,


0 0
原创粉丝点击