Hibernate的Session的理解

Hibernate中的Session是一级缓存,可以理解为进程级(是线程吧)的缓存,在进程(是线程吧)运行期间一直存在。

session可以理解为一个可以操作数据库的对象,该对象中有操作数据库的方法。

在Java里面,缓存通常是指Java对象的属性占用的内存空间,通常是一些集合类型的属性。在Session接口的实现类SessionImpl中定义了一系列的Java集合,这些Java集合就构成了Session的缓存。

总的来说(我对Session的理解):Session是Hibernate和DB的中间人(一个对象),Session中有两块东西或者说是功能

(1)操作数据库的方法

(2)Session中有一些属性(集合之类的东西),通过这些属性来存储要发送给DB的sql语言、缓存从DB中已经查出来的数据等

单独的Hibernate程序操作数据库的流程:

1、获取Session

2、打开事务

3、操作数据库

4、提交(回滚)事务

5、关闭Session

这样就完成了操作数据库

注一:Hibernate在操作数据库前需要得到Session的实例,这类似于JDBC中的connection

获取session的方法如下:

Session session = sessionFactory.openSession();

通过Session对象可以对数据库进行增删改查的操作,对应的方法分别为:

save(),delete(),update(),savaOrUpdate(),load(),get(),在Hibernate3中取消了find()方法,必须通过Query或Criteria来进行查询。

注二:openSession()和getCurrentSession()方法的区别之一

openSession()需要自己关闭session

getCurrentSession()不需要自己关闭session,提交(回滚)事务的时候自动关闭session

Hibernate中Java对象的状态

使用缓存的一个明显的好处就是可以减少数据库访问的频率,提高应用程序的性能,因为从内存中读取数据显然要比从数据库中查询快的多。

鉴于此Hibernate中设计出了Java对象的三种状态。

1、临时状态(Transient)。处于该状态的对象还没有被纳入Hibernate的缓存管理体系,跟任何Session都不关联,在数据库中没有对应的记录。

2、持久化对象(Persistent)。处于这个状态的对象位于Session的缓存中,并且和数据库中的一条数据记录想对应。

3、游离状态(Detached)。处于这个状态的对象不再位于Session的缓存中,它与临时对象的最大区别在于,游离对象在数据库中还可能存在一条与它对应的记录。

  上述3个状态是可以相互转化的,而且我们所说的状态都是针对某一个Session的实例而言的,比方说,对象A对于session1而言是处于持久化状态的,因为它处于session1的缓存中,但是对于session2而言对象A并不在它的缓存中,因此它是处于游离状态的。

原文地址:https://www.cnblogs.com/jingyunyb/p/3824196.html