转自:https://blog.csdn.net/yiguang_820/article/details/79073152

初学Hibernate,了解到Hibernate有三种状态:transient(瞬时状态),persistent(持久化状态)以及detached(游离状态)。

  它们之间有如下转换图来说明:

  

 1.临时对象(Transient):

  • 在使用代理主键的情况下,OID通常为null
  • 不处于Session的缓存中
  • 在数据库中没有对应的记录

2.持久化对象(也叫“托管”)(Persist):

  • OID不为null
  • 位于Session缓存中
  • 若在数据库中已经有和其对应的记录,持久化对象和数据库中的相关记录对应
  • 在同一个Session实例的缓存中,数据库表中的每条记录只对应唯一的持久化对象

3.删除对象(Removed):

  • 在数据库中没有和其OID对应的记录
  • 不再处于Session缓存中
  • 一般情况下,应用程序不该再使用被删除的对象

4.游离对象(也叫“托管”)(Detached):

  • OID不为null
  • 不再处于Session缓存中
  • 一般情况下,游离对象是由持久化对象转变过来的,因此在数据库中可能还存在于它对应的记录
 
Session的update()方法:

  • Session的update()方法使一个游离对象转变为持久化对象,并且计划执行一条update语句。
  • 若希望session仅当修改了News对象的属性时,才执行update()语句,可以把映射文件中<class>元素的select-before-update设为true,该属性的默认值为false。(一般不使用,只有在和出发协同工作时才会设置,以防出现问题)
  • 当update()方法关联一个游离对象时,如果在Session的缓存中已经存在相同OID的持久化对象,会抛出异常
  • 当update()方法关联一个游离对象时,如果在数据库中不存在相应的记录,也会抛出异常
 
Session的saveOrUpdate()方法:
1.Session的saveOrUpdate()方法同时包含了save()与update()的功能
  • News对象如果是游离对象,则执行update()方法;如果是临时对象,则执行save()方法。

2.判定对象为临时对象的标准

  • Java对象的OID为null
  • 映射文件中<id>设置了 unsaved-value属性,并且Java对象的OID取值与这个unsave-value属性值匹配
 
Session的merge()方法:
 
Session的delete()方法:
1.Session的delete()方法既可以删除一个游离对象,也可以删除一个持久化对象
2.Session的delete()方法处理过程

  • 计划执行一条delete语句
  • 把对象从Session缓存中删除,该对象进入删除状态

3.Hibernate的.cfg.xml配置文件中有一个hibernate.use identifier rollback属性,其默认值为false,若把它设为true,将改变delete()方法的运行行为:delete()方法会把持久化对象或游离对象的OID设置为null,使它们变为临时对象

 
 
通过Hibernate调用存储过程
1.Work接口:直接通过JDBC API来访问数据库的操作
public interface Work{
public void execute(Connection connection) throw SQLException;
}
2.Session的doWork(Work)方法用于执行Work对象指定的操作,即调用Work对象的excute()方法,Session会把当前使用的数据库连接传递给execute()方法
public void testDoWork() {
session.doWork(new Work() {

@Override
public void execute(Connection arg0) throws SQLException {
System.out.println(arg0);

//调用存储过程
}

});

Hibernate与触发器协同工作

Hibernate与数据库中的触发器协同工作时,会造成两类问题:

  • 触发器使Session的缓存中的持久化对象与数据库中对应的数据不一致:触发器运行在数据库中,它执行的操作对Session是透明的
  • Session的update()方法盲目地激发触发器:无论游离对象的属性是否发生变化,都会执行update语句,而update语句会激发数据库中相应的触发器

解决方法:

  • 在执行完Session的相关操作后,立即调用Session的flush()和refresh()方法,迫使Session的缓存与数据库同步()refresh()方法重新从数据库中加载对象)
    • 在映射文件的<class>元素中设置select-before-update属性:当Session的update或saveOrUpdate()方法更新一个游离对象时,会先执行Select语句,获得当前游离对象在数据库中的最新数据,只有在不一致的情况下才会执行update语句。

举例理解Hibernate的三种状态(转)的更多相关文章

  1. 举例理解Hibernate的三种状态

    初学Hibernate,了解到Hibernate有三种状态:transient(瞬时状态),persistent(持久化状态)以及detached(游离状态). 它们之间有如下转换图来说明: 1.tr ...

  2. Hibernate的三种状态及对象生命周期

        理解Hibernate的三种状态,更利于理解Hibernate的运行机制,这些可以让你在开发中对疑点问题的定位产生关键性的帮助. 三种状态 临时状态(Transient):在通过new关键字, ...

  3. 第五讲:深入hibernate的三种状态

    学过hibernate的人都可能都知道hibernate有三种状态,transient(瞬时状态),persistent(持久化状态)以及detached(离线状态),大家伙也许也知道这三者之间的区别 ...

  4. [转]深入hibernate的三种状态

    学过hibernate的人都可能都知道hibernate有三种状态,transient(瞬时状态),persistent(持久化状态)以及detached(离线状态),大家伙也许也知道这三者之间的区别 ...

  5. 深入hibernate的三种状态

    学过hibernate的人都可能都知道hibernate有三种状态,transient(瞬时状态),persistent(持久化状态)以及detached(离线状态),大家伙也许也知道这三者之间的区别 ...

  6. 深入hibernate的三种状态(转)

    hibernate的三种状态: 瞬时对象,持久化对象,托管对象. hibernate的两级缓存:1>一级缓存:session    2>二级缓存:sessionfactory. 瞬时对象: ...

  7. hibernate的三种状态(儿)

    第五讲:hibernate的三种状态 瞬时:bean对象与session,与数据库无关.在session对象的save方法保存之前. 持久状态(托管):bean对象与session有关,数据库中有对应 ...

  8. hibernate的三种状态和缓存

    hibernate的三种状态: 1.瞬时态:对象里面没有id值,对象与session没有关联 类似,把class类new出来,不存进session 2.持久态:对象里面有id值,对象与session关 ...

  9. 【转】hibernate对象三种状态

    hibernate里对象有三种状态: 1,Transient 瞬时 :对象刚new出来,还没设id,设了其他值. 2,Persistent 持久:调用了save().saveOrUpdate(),就变 ...

随机推荐

  1. Person Re-identification 系列论文笔记(三):Improving Person Re-identification by Attribute and Identity Learning

    Improving Person Re-identification by Attribute and Identity Learning Lin Y, Zheng L, Zheng Z, et al ...

  2. [转]The Curse of Dimensionality(维数灾难)

    原文章地址:维度灾难 - 柳枫的文章 - 知乎 https://zhuanlan.zhihu.com/p/27488363 对于大多数数据,在一维空间或者说是低维空间都是很难完全分割的,但是在高纬空间 ...

  3. 创建ROS 工作空间时出现:程序“catkin_init_workspace”尚未安装,程序“catkin_make”尚未安装。

    问题:创建ROS 工作空间时出现:程序“catkin_init_workspace”尚未安装,程序“catkin_make”尚未安装. 解决方法: source /opt/ros/kinetic/se ...

  4. oracle函数 trunc(x[,y])

    [功能]返回x按精度y截取后的值 [参数]x,y,数字型表达式,如果y不为整数则截取y整数部分,如果y>0则截取到y位小数,如果y小于0则截取到小数点向左第y位,小数前其它数据用0表示. [返回 ...

  5. 初识block

    我们可以把Block当做Objective-C的匿名函数.Block允许开发者在两个对象之间将任意的语句当做数据进行传递,往往这要比引用定义在别处的函数直观.另外,block的实现具有封闭性(clos ...

  6. Python进阶04函数的参数对应

    我们已经接触过函数(function)的参数(arguments)传递.当时我们根据位置,传递对应的参数.我们将接触更多的 参数传递方式. 回忆一下位置传递: def f(a,b,c): return ...

  7. centos下iptables使用

    iptables的使用规则: 1.表    (table) 包含4个表(哪个表是当前表取决于内核配置选项和当前模块):4个表的优先级由高到低:raw-->mangle-->nat--> ...

  8. 微信小程序封装自定义弹窗

    最近在做小程序的登录,需要同时获取用户手机号和头像昵称等信息,但是小程序又不支持单个接口同时获取两种数据,因此想到自定义一个弹窗,通过弹窗按钮触发获取手机号事件.记录一下. 具体代码如下: 业务代码中 ...

  9. E - Count on a tree 树上第K小

    主席树的入门题目,这道题的题意其实就是说,给你一棵树,询问在两个节点之间的路径上的区间第K小 我们如何把树上问题转换为区间问题呢? 其实DFS就可以,我们按照DFS的顺序,对线段树进行建树,那么这个树 ...

  10. JS划重点——类和对象的不正经阐述

    JS划重点--类和对象的不正经阐述 /在JS 类里面函数也是一个对象,那么要创建一个对象就需要一个类,这个类可以由这个对牛逼的对象-函数来实现/ /首先是普罗大众都会的 工厂模式来创建一类/ func ...