Hibernate中的实体对象可以分为三种状态:Transient(临时)、Persistent(持久)、Detached(游离)

  • Transient

用new创建出对象,这些对象还没有与数据库发生任何的关系,不对应于数据库中的任一笔数据;Persistent 对象通过调用delete()方法,也成为Transient 的,例:


Session session = sessions.openSession(); Transaction tx = session.beginTransaction(); int userID = 1234; User user = (User) session.get(User.class, new Long(userID)); session.delete(user); tx.commit(); session.close();

这种方法实际执行了delete sql语句。把Detached (脱管)对象转换成Transient(瞬时)的,例:


Session session = sessions.openSession(); Transaction tx = session.beginTransaction(); session.delete(user); tx.commit(); session.close();

将对象同Session 关联然后删除。

  • Persistent

当对象与数据库中的数据有对应关系,并且与Session实例有关联,并且Session实例尚未关闭,则它是在Persistent状态。例:Transient状态的对象使用Session的save()方法保存到数据库后,对象成为persistent状态,例:


DomesticCat fritz = new DomesticCat(); fritz.setColor(Color.GINGER); fritz.setSex(‘M’); fritz.setName("Fritz"); Long generatedId = (Long) session.save(fritz); //使用Hibernate从数据库得到数据并封装为对象(例如使用get()、load()),则该对象为Persistent状态 //get() User user = (User) session.get(User.class, new Long(userID)); //load() User user = (User) session.load(User.class, new Long(userID)); //get()和load()的区别在于:当要查找的对象数据不存在时,load()方法就是直接抛出异常,而get()方法则返回null值 //Detached 状态对象重新和session关联后(通过update或lock方法)变成Persistent 状态,例: /update() //user是session1关闭后留下的脱管对象 user.setPassword("secret"); Session session2 = sessionFactory.openSession(); Transaction tx = session2.beginTransaction(); session2.update(user); user.setUsername("jonny"); tx.commit(); session2.close(); //这种方式,关联前后做修改都不打紧,关联前后做的修改都会被更新到数据库; //比如关联前你修改了password,关联后修改了username,事务提交时执行的update语句会把password、username都更新 //lock() Session session2 = sessions.openSession(); Transaction tx = session2 .beginTransaction(); session2 .lock(user, LockMode.NONE); user.setPassword("secret"); user.setLoginName("jonny"); tx.commit(); session2 .close();

这种方式,关联前后是否做修改很重要,关联前做的修改不会被更新到数据库,比如关联前你修改了password,关联后修改了loginname,事务提交时执行的update语句只会把loginname更新到数据库,所以,确信分离对象没有做过更改才能使用lock()。如果将Session实例关闭,则Persistent状态的对象会成为Detached状态。

  • Detached

Detached状态的对象,与数据库中的具体数据对应,但脱离Session实例的管理,例如:在使用load()、get()方法查询到数据并封装为对象之后,将Session实例关闭,则对象由Persistent状态变为Detached状态。

Detached状态的对象之任何属性变动,不会对数据库中的数据造成任何的影响。这种状态的对象相当于cache数据,因为他不和session关联,谁都可以用,任何session都可以用它,用完后再放到cache中。从上面看,hibernate对数据的处理确实比较聪明,一个session用完一个持久对象后,可以不删除这个对象,而是把它和session分离开,放到应用的cache中,其他session可以到cache中找需要的数据,但这导致了新的问题,和新的解决办法。

三种状态的转换图如下:

Hibernate对象的状态转换的更多相关文章

  1. Hibernate对象的状态和映射

    一. Hibernate对象的状态 实体对象的三种状态: 1) 暂态(瞬时态)(Transient)---实体在内存中的自由存在,它与数据库的记录无关. po在DB中无记录(无副本),po和sessi ...

  2. Hibernate对象的状态

    站在持久化的角度, Hibernate 把对象分为 4 种状态: 1. 持久化状态 2. 临时状态 3. 游离状态 4. 删除状态 Session 的特定方法能使对象从一个状态转换到另一个状态. 下面 ...

  3. Hibernate(3)——实例总结Hibernate对象的状态和ThreadLoacl封闭的session

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: Hibernate的内部执行过程(CRUD) 对象的状态及其转换图和例子 使用JUnit测试 使用getCur ...

  4. Hibernater中的持久化对象以及状态转换

    一.持久化对象的要求 1.提供一个无参的构造器:使Hibernate可以使用Constructor.newInstance() 来实例化持久化类. 2.提供一个标识属性(identifier prop ...

  5. Hibernate对象的状态分类

    对象的状态: 临时状态Transient: 与数据库没有对应,跟Session没有关联 一般是新new出的对象 持久化状态Persistent: 对象在Session的管理之中,最终会有对应的数据库记 ...

  6. hibernate对象的状态以及生命周期

    瞬时状态:session中没有,数据库中没有 持久状态:session中有,数据库中有 游离状态:session中没有,数据库中有 get和load都是用来提取数据的 get和load的区别: get ...

  7. hibernate中持久化对象的状态

    持久化对象有以下几种状态: 临时对象(Transient): 在使用代理主键的情况下,  OID 通常为 null  不处于 Session 的缓存中 在数据库中没有对应的记录 持久化对象(也叫”托管 ...

  8. (转)Hibernate框架基础——在Hibernate中java对象的状态

    http://blog.csdn.net/yerenyuan_pku/article/details/52760627 在Hibernate中java对象的状态 Hibernate把对象分为4种状态: ...

  9. 菜鸟学SSH(八)——Hibernate对象的三种状态

    前面写了几篇关于SSH的博客,但不是Struts就是Spring,Hibernate还从来没写过呢.说好是SSH的,怎么可以光写那两个,而不写Hibernate呢对吧.今天就先说说Hibernate对 ...

随机推荐

  1. UVA 1390 Interconnect

    https://vjudge.net/problem/UVA-1390 题意: 给出n个点m条边的无向图, 每次随机加一条非自环的边,(加完后可出现重边), 添加每条边的概率是相等的 求使图连通的期望 ...

  2. 动态规划:插头DP

    这种动归有很多名字,插头DP是最常见的 还有基于连通性的动态规划 轮廓线动态规划等等 超小数据范围,网格图,连通性 可能算是状态压缩DP的一种变式 以前我了解的状压DP用于NP难题的小数据范围求解 这 ...

  3. sklearn中的model_selection模块(1)

    sklearn作为Python的强大机器学习包,model_selection模块是其重要的一个模块: 1.model_selection.cross_validation: (1)分数,和交叉验证分 ...

  4. 解决gridview row 左边序列号 显示不完全的技巧

    放在主程序 入口处, public Form1() { InitializeComponent(); gridView1.IndicatorWidth = ; //<宽度值>官方推荐常用是 ...

  5. 【CodeForces】576 C. Points on Plane

    [题目]C. Points on Plane [题意]给定坐标系中n个点的坐标(范围[0,10^6]),求一种 [ 连边形成链后总长度<=2.5*10^9 ] 的方案.n<=10^6. [ ...

  6. laravel后台返回ajax数据

    后台模式: $array = array('msg'=>'添加失败!','status'=>'false'); return json_encode($array); 前台显示: $.aj ...

  7. 去掉input获取focus时的边框

    贴图,问题如下: 尽管已经设置输入框的border为none,当输入框focus时扔会出现浏览器自带的边框 解决方法,添加如下样式即可,.fs_input为输入框样式 ---------------- ...

  8. bzoj 3123 可持久化线段树启发式合并

    首先没有连边的操作的时候,我们可以用可持久化线段树来维护这棵树的信息,建立权值可持久化线段树,那么每个点继承父节点的线段树,当询问为x,y的时候我们可以询问rot[x]+rot[y]-rot[lca( ...

  9. Tomcat参数调优包括日志、线程数、内存【转】

    [Tomcat中日志打印对性能测试的影响] 一般都提供了这样5个日志级别: ▪ Debug ▪ Info ▪ Warn ▪ Error ▪ Fatal 由于性能测试需要并发进行压力测试,如果日志级别是 ...

  10. logging模块配置笔记

    logging模块配置笔记 log文件的路径 #判断在当前的目录下是否有一个logs文件夹.没有则创建 log_dir = os.path.dirname(os.path.dirname(__file ...