Hibernate对象的状态转换
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对象的状态转换的更多相关文章
- Hibernate对象的状态和映射
一. Hibernate对象的状态 实体对象的三种状态: 1) 暂态(瞬时态)(Transient)---实体在内存中的自由存在,它与数据库的记录无关. po在DB中无记录(无副本),po和sessi ...
- Hibernate对象的状态
站在持久化的角度, Hibernate 把对象分为 4 种状态: 1. 持久化状态 2. 临时状态 3. 游离状态 4. 删除状态 Session 的特定方法能使对象从一个状态转换到另一个状态. 下面 ...
- Hibernate(3)——实例总结Hibernate对象的状态和ThreadLoacl封闭的session
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: Hibernate的内部执行过程(CRUD) 对象的状态及其转换图和例子 使用JUnit测试 使用getCur ...
- Hibernater中的持久化对象以及状态转换
一.持久化对象的要求 1.提供一个无参的构造器:使Hibernate可以使用Constructor.newInstance() 来实例化持久化类. 2.提供一个标识属性(identifier prop ...
- Hibernate对象的状态分类
对象的状态: 临时状态Transient: 与数据库没有对应,跟Session没有关联 一般是新new出的对象 持久化状态Persistent: 对象在Session的管理之中,最终会有对应的数据库记 ...
- hibernate对象的状态以及生命周期
瞬时状态:session中没有,数据库中没有 持久状态:session中有,数据库中有 游离状态:session中没有,数据库中有 get和load都是用来提取数据的 get和load的区别: get ...
- hibernate中持久化对象的状态
持久化对象有以下几种状态: 临时对象(Transient): 在使用代理主键的情况下, OID 通常为 null 不处于 Session 的缓存中 在数据库中没有对应的记录 持久化对象(也叫”托管 ...
- (转)Hibernate框架基础——在Hibernate中java对象的状态
http://blog.csdn.net/yerenyuan_pku/article/details/52760627 在Hibernate中java对象的状态 Hibernate把对象分为4种状态: ...
- 菜鸟学SSH(八)——Hibernate对象的三种状态
前面写了几篇关于SSH的博客,但不是Struts就是Spring,Hibernate还从来没写过呢.说好是SSH的,怎么可以光写那两个,而不写Hibernate呢对吧.今天就先说说Hibernate对 ...
随机推荐
- bzoj 3261: 最大异或和 (可持久化trie树)
3261: 最大异或和 Time Limit: 10 Sec Memory Limit: 512 MB Description 给定一个非负整数序列 {a},初始长度为 N. ...
- 还不会做! 树上的gcd 树分治 UOJ33
题目链接:http://uoj.ac/problem/33 题解链接:http://vfleaking.blog.uoj.ac/blog/38 现在感觉到了做OI的层层递进的思路的伟大之处,作为一个大 ...
- CF767 B. The Queue 贪心+细节
LINK 题意:一个业务开始时间为s,结束时间为f,一个人办护照的时间需要m分(如果在x时开始服务,且x+m==f那么还是合法的),你可以选择任意时间到达,但如果你和其他人同时到达,你要排在他的后面. ...
- JAVA多线程基础学习一:基础知识
我们知道多线程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 一.线程基本概念 1 线程:进程中负责程序执行的执行单元(执行 ...
- JVM学习三:JVM之类加载器之连接分析
学习完类加载之加载篇后,让我们继续来看加载之连接,连接分为三个步骤:验证.准备和解析三步,我们将一一分析之. 连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去. 类加载完毕之后进入 ...
- 天梯赛L2-008 最长对称子串 (字符串处理)
对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s&quo ...
- DeprecationWarning: Tapable.plugin is deprecated. Use new API on `.hooks` instead extract-text-webpack-plugin 提取css报错
深入浅出Webpack 1-5 使用pulugin extract-text-webpack-plugin 提取css报错 DeprecationWarning: Tapable.plugin is ...
- 关于select联动的两种做法
第一种方法: function dong(){ var getSheng = document.getElementById("sheng"); var get ...
- 微信access_token和refresh_token保存于redis
简介 通常理解的access_token和refresh_token access_token是用来对客户端进行认证的,类似与密码,有一定的有效期.当过期后可使用refresh_token重新获取一个 ...
- ssh -o 常用选项
ssh -o ConnectTimeout=3 -o ConnectionAttempts=5 -o PasswordAuthentication=no -o StrictHostKeyCheckin ...