对象-关系映射(ORM,Object/Relational Mapping):为了解决JDBC实现对象持久化问题。使业务逻辑和数据访问细节相分离,在单个组件中负者所有实体对象持久化,一种实现方式是利用硬编码方式,为每一种可能的数据库访问操作提供单独的方法。
Hibernate是基于JavaEE平台上一种开放源代码的ORM框架技术,完全的关系型数据库的OR映射,提供管理Java对象到数据库表的映射,提供数据查询和获取数据的方法,事务处理,生命周期管理不依赖于JavaEE容器。
5个核心接口API:
Configuration:用于Hibernate配置,Hibernate启动中,实现该接口类首先定位映射文档位置,读取配置文件信息,创建一个SessionFaction对象
SessionFactory:产生Session对象,一个SessionFactory对象代表一个数据库,被所有客户程序在内存共享,用它来得到不同的Session对象。
Session:提供对数据持久对象操作方法,持久对象缓冲区,检测缓冲区中的持久对象是否已经改变,并且及时刷新数据库,保证Session中对象与数据库同步。
Transaction:不依赖于容器,使用自己的API来调用底层事务API(如:Jdbc Api、JTA)打到事务处理目的。
Query&Criteria:Query接口可以方便地对数据库及持久对象进行查询,Criteria接口与Query接口非常类似,它允许创建并执行面向对象的标准化查询。
实体对象在Hibernate中状态:
瞬时(临时)状态:当实例化一个持久化对象,此时当前对象所保存的数据与数据库没有任何关系。
持久状态:当Hibernate API把处于瞬时状态的持久化对象与数据库中的数据进行关联,对象具有唯一的OID。
游离状态:当Hibernate API的Session关闭后,对象不在持久化管理之内,此时处于游离状态。
Session接口操作方法:
save:将临时对象转变为持久对象,不应将持久对象或游离对象传递给save方法,若持久对象传递save该操作多余,若游离对象传递save,则重新生成OID,再保存一次。
saveOrUpdate:包含save方法与update方法功能,如果传入临时对象则调用save,如果是游离对象则调用update。
注:Hibernate根据对象OID,version版本熟悉来判断参数是临时对象还是游离对象
persist:将临时对象转变为持久对象,persist不保证立即为持久对象OID赋值,可能在session清理缓存才赋值,在事务边界以外调用persist方法,则该方法不会执行insert语句,而save无论在事务边界意外还是以内都会执行insert。
注:save返回Serializable对象,persist返回void。
load&get:都能根据从给定的OID从数据库中加载一个持久化对象,都会首先查一级缓存,没查到则查询二级缓存,再找不到则发送一条SQL语句。
load:当对象.hbm.xml配置文件class元素的lazy属性设置为true,当数据库不存在OID对应记录时,只会返回一个代理对象,只有在对象getId之外的其他方法调用时才会真正访问数据库,在某些情况下大幅度提高性能,采用配置加载策略(默认:延迟加载),如果设置为false时则立即执行数据库并直接返回实体类。
get:当数据不存在OID对应记录时返回null。会忽略配置,采用立即加载。
clear:对session里的缓存进行清理
evict:把指定缓冲对象进行清除
flush:对数据库同步语句,执行完后立即刷新到数据库。
update:使一个游离对象转变为持久对象,不会进行版本检测,直到session.flush时,会先进行版本检测,再进行更新操作。
lock:执行lock时,会立即使用查询语句查询版本号进行版本检测,将没有更改过的游离状态对象变成持久状态,
merge:将游离对象属性复制到持久对象中。
注:流程:1、根据OID到session中查找,若存在则将游离对象属性复制到持久化对象,计划执行一条update语句,然后返回持久化对象引用。2、如果session没找到,则试图根据OID从数据库加载持久化对象,如果数据库存在匹配持久化对象,则将游离对象属性复制到刚加载的持久化对象中,计划实行一条update语句,然后返回持久化对象引用。3、如果数据库中也不存在或者对象时临时对象,则会新建一个对象,将属性赋值到新建对象中,在持久化新建对象,最后返回新建对象引用。与saveOrUpdate区别是,调用完meger对象仍然是托管状态
delete:从数据库中删除一个java对象,可以删除持久化类,也可以删除游离对象.
注:1、如果传入的是游离对象,则先使游离对象与session关联,变为持久对象,如果是持久对象则忽略该步2、计划执行delete语句。3、把对象从session缓存中删除,该对象进入删除状态。
replicate:将一个数据库中的对象复制到另一个数据库中
Query对象查询:
list:执行HQL查询语句,直接操作SQL访问数据库
iterate:执行HQL查询语句,会根据主键字段到一二级缓存里查找,有就加入到查询结果,没有则执行查询语句
uniqueResult:统计计数
Criteria对象查询:
list:
Projections聚合函数:
groupProperty:
avg:求平均
count:统计
max:最大
min:最小
countDestinct:
某列非重复记录的总数
注:支持别名、多态、排序、分页、参数绑定、命名查询,使用Critterion对象设置查询条件,使用Expression.条件进行设置条件
SQLQuery本地SQL查询:
list:
CallableStatement存储过程调用:
execute:
batch-size:设定对数据库进行批量删除、更新、插入时候的批次大小,批量操作数量设置。一般设置50
fetch_size:设定JDBC的Statement读取数据时,每次从数据库中取出的记录条数 设置50或100 比较合理 -- mysql不支持,oracle支持
注:HQL(Hinberante Query Language)
二级缓存框架:
EHCache:
OSCache:
JBossCache:
面试问题:
hibernate中sorted collection和ordered collection有什么不同?
sorted collection:通过java的 comparator在内存中排序。
ordered collection:使用数据库order by字句进行排序。
注:对于比较大数据集,避免内存溢出,最好使用ordered collection
lock方法与update方法区别?
两个方法都是将游离对象与一个session实例关联起来,不同的是在执行lock方法时,会立即使用版本查询语句进行版本检测,不执行update操作,而update方法,并不会进行版本检测,直到session.flush时,会先进行版本检测,再进行更新操作。
Hibernate实体类定义为final类?
可以,但这种做法并不好,因为Hibernate会使用代理模式在延迟关联情况下提高性能,如果把实体定义为final类后,因为java不允许对final类进行扩展,所以Hibernate就无法使用代理了。则限制了使用可以提升性能的手段。