Hibernate核心接口(包括接口的常用方法)和工作原理


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对象用于配置并根启动HibernateHibernate应用通过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();
	}
	




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值