一、Session的特点和获取

特点:

Session不是线程安全的,它代表与数据库之间的一次操作,它的概念介于Connection和Transaction之间。

 Session也称为持久化管理器,因为它是与持久化有关的操作接口。

 Session通过SessionFactory打开,在所有的工作完成后,需要关闭。

它与Web层的HttpSession没有任何关系。

获取:

<span style="font-family:KaiTi_GB2312;font-size:18px;">//默认读取hibernate.cfg.xml文件
Configuration cfg=new Configuration().configure();
//建立SessionFactory
SessionFactory factory=cfg.buildSessionFactory();
//取得session
Session session=null;
session=factory.openSession();</span>

二、Session的生命周期

在session的生命周期里面,我们可以发现,session主要有三个状态:Transient(瞬时)、Persistent(持久化)、Detached(脱管)

2.1,瞬时(Transient )

使用new 操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其它对象所引用),它们的状态将会丢失,并由垃圾回收机制回收。

2.2,持久化(Persist )

持久实例是任何具有数据库标识的实例。它有持久化管理器Session统一管理,持久实例是在事务中进行操作的——它们的状态在事务结束时同数据库进行同步。当事务提交时,通过执行SQL的INSERT、UPDATE和DELETE语句把内存中的状态同步到数据库中。

2.3,脱管(Detached )

Session关闭之后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理。

三、实例解析session的三大状态

<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="white-space:pre">	</span>public void testSave2(){
Session session=null;
Transaction tx=null;
try {
session=HibernateUtils.getSession();
tx=session.beginTransaction(); //Transient状态
User user=new User();
user.setName("张三");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date()); //以上user就是Transient(瞬时状态),表示没有被session管理并且数据库中没有
//执行save之后,被session所管理,而且,数据库中已经存在,此时就是Persistent状态
session.save(user);
//此时user是持久化状态,已经被session所管理,当再次提交时,会把session中的对象和目前的对象进行比较
//如果两个对象中的值不一致就会继续发出相应的sql语句
user.setName("王五"); //可以显示的调用update方法,因为此时为持久状态,调用update没有什么意义,但是
session.update(user);
//此时会发出2条sql,一条用户做插入,一条用来做更新
tx.commit(); } catch (Exception e) {
e.printStackTrace();
if(tx!=null){
tx.rollback();
}
}finally{
HibernateUtils.closeSession(session);
}
//detached状态
}</span>

控制台打印的sql语句:

Hibernate: insert into User (name, password, createTime, expireTime, id) values (?, ?, ?, ?, ?)

Hibernate: update User set name=?, password=?, createTime=?, expireTime=? where id=?

<span style="font-family:KaiTi_GB2312;font-size:18px;">	public void testSave3(){
Session session=null;
Transaction tx=null;
User user=null;
try {
session=HibernateUtils.getSession();
tx=session.beginTransaction(); //Transient状态
user=new User();
user.setName("Angel");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date()); //Persistent状态
session.save(user);
tx.commit(); } catch (Exception e) {
e.printStackTrace();
if(tx!=null){
tx.rollback();
}
}finally{
HibernateUtils.closeSession(session);
}
//detached状态
user.setName("soffe");
try {
session=HibernateUtils.getSession();
session.beginTransaction(); //将detached状态的对象重新纳入session管理
//此时将变为persistent状态的对象
//persistent状态的对象,在清理缓存是会和数据库同步
session.update(user);
session.getTransaction().commit(); } catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}</span>

要将一个脱管对象变为一个持久化对象,应该调用update方法,而不是save方法。如果调用save方法,那么Hibernate会根据其id生成策略执行insert语句,向数据库里插入一条数据。

四、总结

当一个对象处于持久化状态的时候,如果对该对象多次调用update、save方法,或者多次修改,hibernate都不会执行相应的sql语句。当事务提交时,hibernate会将当前对象与之前保存在session中的对象进行对比,如果不相同,就执行update语句,否则不执行。

状态/存在位置 内存 缓存 数据库
瞬时状态
持久状态
脱管状态


[Hibernate 2]session的三种状态的更多相关文章

  1. Hibernate中对象的三种状态以及Session类中saveOrUpdate方法与merge方法的区别

    首先,用一张图说明一个对象,在Hibernate中,在调用了不同方法之后对象所处的不同状态 在Hibernate中,一个对象的状态可以被分为如图所示的三种 Transient:瞬时对象,该对象在数据库 ...

  2. hibernate - 一级缓存和三种状态解析

    转载自:http://www.cnblogs.com/whgk/p/6103038.html 一.一级缓存和快照 什么是一级缓存呢? 很简单,每次hibernate跟数据库打交道时,都是通过sessi ...

  3. Hibernate之对象的三种状态

    Hibernate之Java对象的三种状态 一.简述 本博文大部分的思想和内容引子CSND上名为 FG2006 这位大神的文章,连接地址为:http://blog.csdn.net/fg2006/ar ...

  4. Hibernate持久化对象的三种状态深入理解

    关于OID hibernate缓存是一个map,他会根据OID作为缓存对象的key,我们的映射文件中<id>标签指定的属性值会作为OID 持久化对象的三种状态 为了方便理解,Hiberna ...

  5. 【SSH系列】-- Hibernate持久化对象的三种状态

    在上一篇博文中,小编主要简单的介绍了[SSH系列]--hibernate基本原理&&入门demo,今天小编来继续介绍hibernate的相关知识, 大家知道,Java对象的生命周期,是 ...

  6. Hibernate中对象的三种状态及相互转化

    1. 瞬时状态 (Transient) 当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,如下:  Customer customer=new Customer(“ ...

  7. Hibernate一级缓存和三种状态

    Hibernate一级缓存又称session缓存,生命周期很短,跟session生命周期相同. 三种状态:1.transient(瞬时态):刚new出来的对象,既不在数据库中,也不在session管理 ...

  8. hibernate 实体对象的三种状态以及转换关系。

    最新的Hibernate文档中为Hibernate对象定义了四种状态(原来是三种状态,面试的时候基本上问的也是三种状态),分别是:瞬时态(new, or transient).持久态(managed, ...

  9. Hibernate中对象的三种状态即save(),update(),saveOrUpdate()的使用【转】

    当new一个user的时候,是处于瞬时状态 当调用session.save(user)的时候,user对象会放到session里,此时处于持久状态 当提交事务的时候,user对象才会存到DB中 当调用 ...

随机推荐

  1. Java-螺旋方阵

    用Java实现螺旋方阵 螺旋方阵:是指呈螺旋状的矩阵. 具体实现如下: public void screwMatrix() { System.out.print("请输入数字:") ...

  2. JavaScript的jsonp

    目录索引: 一.AJAX的概念二.POST && GET三.原生实现AJAX简单示例 3.1 实现代码 3.2 重点说明四.框架隐藏域 4.1 基本概念 4.2 后台写入脚本 4.3 ...

  3. 502 bad gateway 可能的错误原因

    1.PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间 #http代码段中增加 fastcgi_connect_timeout ...

  4. python(14)类,方法,对象,实例

    类: 简单来说就是一个函数的集合,在这个集合里面你定义了很多个函数: 方法:其实就是你定义的这些函数. 对象:简单来说就是自身具有多个属性(也可以说是子变量)的变量而已. 在下面的例子中class P ...

  5. Studio之版本管理工具Git (图文教程)

    目前业界主流的版本管理工具主要是 svn/git.svn是1种集中式的代码管理工具,而git是1种散布式的代码管理工具,广受极客的爱好.而基于git的github更是全宇宙码农的提高逼格,深究技术的必 ...

  6. java中四种引用类型(转)

    今天看代码,里面有一个类java.lang.ref.SoftReference把小弟弄神了,试想一下,接触java已经有3年了哇,连lang包下面的类都不了解,怎么混.后来在网上查资料,感觉收获颇多, ...

  7. Java 查看死锁的方法

    那我们怎么确定一定是死锁呢?有两种方法. 1>使用JDK给我们的的工具JConsole,可以通过打开cmd然后输入jconsole打开. 1)连接到需要查看的进程.

  8. JAVA 什么时候使用静态

    static所修饰的内容是成员(成员属性.成员方法) 从两方面入手:1.什么时候使用静态的成员属性:当属于同一个类的所有对象出现共享数据时,需要将存储这个共享数据的成员变量用static修饰 2.什么 ...

  9. winform DataGridView控件判断滚动条是否滚动到当前已加载的数据行底部 z

    http://www.zuowenjun.cn/post/2015/05/20/162.html 判断 DataGridView控件滚动条是否滚动到当前已加载的数据行底部,其实方法很简单,就是为Dat ...

  10. 基于Maven的Springboot+Mybatis+Druid+Swagger2+mybatis-generator框架环境搭建

    基于Maven的Springboot+Mybatis+Druid+Swagger2+mybatis-generator框架环境搭建 前言 最近做回后台开发,重新抓起以前学过的SSM(Spring+Sp ...