Hibernate核心接口(包括接口的常用方法)和工作原理
Hibernate有五大核心接口,分别是:Session Transaction Query SessionFactory Configuration。这五个接口构成了Hibernate运行的基本要素,可以执行存取,持久化,事务管理等操作。这五个接口可以位于系统的业务逻辑层和持久化层。下面是一张Hibernate的关系图:
一、Session接口
Session接口 Session 接口对于Hibernate 开发人员来说是一个最重要的接口。然而在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都不会占用很多资源。这在实际项目中确实很重要,因为在客户程序中,可能会不断地创建以及销毁Session对象,如果Session 的开销太大,会给系统带来不良影响。但是Session对象是非线程安全的,因此在你的设计中,最好是一个线程只创建一个Session对象。 session可以看作介于数据连接与事务管理一种中间接口。我们可以将session想象成一个持久对象的缓冲区,Hibernate能检测到这些持久对象的改变,并及时刷新数据库。我们有时也称Session是一个持久层管理器,因为它包含这一些持久层相关的操作, 诸如存储持久对象至数据库,以及从数据库从获得它们。需要注意的是,Hibernate的session不同于JSP 应用中的HttpSession。当我们使用session这个术语时,我们指的Hibernate 中的session,而我们以后会将HttpSesion 对象称为用户session。
Session常用方法:
1、与数据库增删改查有关的方法
get() load() OID查询方式
save() update() delelte() saveOrUpdae()
createQuery()(HQL查询方式) createCriteria()
get() 方法按照id实现查询-- 查询出的对象的状态是持久化状态,立即加载模式。
示例:session.get(User.class,1);
load() 方法按照id实现查询-- 查询出的对象的状态是持久化状态,懒加载模式--当使用时才会发送sql,不使用时就不会发送sql语句实现懒加载的目的减少数据库压力.
示例:session.load(User.class,1);
save() 首先为给定的自由状态(Transient)的对象(根据配置)生成一个标识并赋值,然后将其持久化。
update() 根据给定的detached(游离状态)对象实例的标识更新对应的持久化实例。
delete() 从数据库中移除持久化(persistent)对象的实例。
saveOrUpdae()当主键字段的值为默认值(null或者0)时,实现是save操作,当主键字段的值不是默认值,同时在表中有此主键值,此时实现的是update操作。当主键字段不是默认值,且在数据表中不存在该值,则会抛出异常。
createQuery() 根据给定的HQL查询条件创建一个新的Query实例。
createCriteria() 为给定的实体类或它的超类创建一个新的Criteria实例。
2、与事务有关的方法
getTransaction():当事务开启之后,通过session获取事务对象
beginTransaction():开启事务
rollback(): 事务回滚
commit():提交事务
3、与缓存有关的方法
一级缓存
clear() evict() flush() refresh()
clear(): 将session缓存中所有对象清除,将对象的状态由持久态转换为游离态。
evict(参数): 作用是将session缓存中指定的对象清除,将对象的状态由持久态转换为游离态.
在clear和evict方法的使用过程中,可以运用于一种环境下,复制session的缓存溢出;session的所管理的对象session自己不会实现清除,
当对象过多同时数据量大可能会出现缓存溢出,可以使用clear或者evict实现定期的清理缓存的工作。
flush(): 强制提交刷新(flush)Session。将session缓存中的数据推出,同时将sql语句推出,推出到数据库端,使sql语句立即执行.
refresh() 刷新,是刷新session缓存
4、close()方法
session.close(); 关闭session
二、SessionFactory接口
SessionFactroy接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
Factory常用方法:
1、openSession() :打开session
2、getCurrentSession() : 获取当前线程session,当在主配置文件中已经将session绑定到当前线程,那么就可以在这里获取session
3、close() :关闭工厂
三、Transaction接口
Transaction接口负责事务相关的操作,一般在Hibernate的增删改中出现,但是使用Hibernate的人一般使用Spring去管理事务。
四、Query接口
Query负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式。它的返回值一般是List。需要自己转换。
五、Configuration接口
Configuration对象用于配置并根启动Hibernate。Hibernate应用通过Configuration实例来指定对象—关系映射文件的位置或者动态配置Hibernate的属性,然后创建SessionFactory实例。
Configuration常用方法:
1、configure(): 默认读取当前项目中的hibernate.cfg.xml的文件
configure(参数):适用于在主配置文件不是hibernate.cfg.xml名称时
2、getProperties(): 从cfg对象的properties集合中读取包括注配置文件中的key-value在内的所有的键值对
3、addResource(): 作用类似于在主配置文件中的mapping的resource属性
4、addClass(): 作用类似于在主配置文件中的mapping的class属性的功能,4.x和5.x有差异
5、buildSessionFactory(): 创建工厂
Hibernate运行过程
1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的<mappingresource="com/xx/User.hbm.xml"/>读取并解析映射信息
3.通过config.buildSessionFactory();//创建SessionFactory
4.sessionFactory.openSession();//打开Sesssion
5.session.beginTransaction();//创建事务Transation
6.persistent operate持久化操作 //一般指Save这个方法
7.session.getTransaction().commit();//提交事务
8.关闭Session
9.关闭SesstionFactory
示例代码:
public void testSave() {
// 创建一个读取主配置文件的对象
Configuration cfg = new Configuration();
// 读取主配置文件
cfg.configure();
// 创建Session工厂
SessionFactory factory = cfg.buildSessionFactory();
// 打开Session
// session = factory.openSession();
// 如果在主配置文件将session绑定到线程中,所以可以从线程中取出session
Session session = factory.getCurrentSession();
// 开启事务
session.beginTransaction();
User user = new User();
user.setUname("孙行者");
session.save(user);
// 提交事务
session.getTransaction().commit();
// 关闭session
session.close();
}