Hibernate三种状态:瞬时状态、持久化状态、离线状态
三种状态及相互转化
瞬时状态(transient):刚new出来一个对象,还没有被保存到数据库中
持久化状态(persistent):已经被保存到数据库中或刚从数据库中取得
离线状态(detached):数据库中有,但是session中不存在该对象

方法的代码实例(下面代码1-8是连贯的,但由于需要分条说明,因此拆开)
(1) save():把一个对象从[瞬时状态]转换成[持久化状态](要注意DB里没有ID重复的该条数据)。
SessionFactory sessionFactory = SessionFactoryBuilder.getInstance();
Session session = sessionFactory.openSession();
session.beginTransaction();
TestUser user1 = new TestUser("1", "name1"); // user变成瞬时状态
session.save(user1); // user变成持久化状态
session.getTransaction().commit(); // 发出insert语句
session.close();
// [输出LOG]
// Hibernate: insert into test_user (user_name, user_id) values (?, ?)
(2) update():把一个对象从[瞬时状态]转换成[持久化状态](要注意DB里要有ID重复的该条数据)。
session = sessionFactory.openSession();
session.beginTransaction();
TestUser user2 = new TestUser("1", "name1-update(2)");
session.update(user2);
session.getTransaction().commit();
session.close();
// [输出LOG]
// Hibernate: update test_user set user_name=? where user_id=?
(3) saveOrUpdate():当(1)(2)中不确定DB里是否有ID重复的该条数据时可以用saveOrUpdate()。
session = sessionFactory.openSession();
session.beginTransaction();
TestUser user3 = new TestUser("1", "name1-update(3)");
TestUser user4 = new TestUser("2", "name2");
session.saveOrUpdate(user3);
session.saveOrUpdate(user4);
session.getTransaction().commit();
session.close();
// [输出LOG]
// Hibernate: select testuser_.user_id, testuser_.user_name as user_nam2_0_ from test_user testuser_ where testuser_.user_id=?
// Hibernate: select testuser_.user_id, testuser_.user_name as user_nam2_0_ from test_user testuser_ where testuser_.user_id=?
// Hibernate: insert into test_user (user_name, user_id) values (?, ?)
// Hibernate: update test_user set user_name=? where user_id=?
(4) 一个commit内先save再多次update,commit时只会做一次insert和一次update。
session = sessionFactory.openSession();
session.beginTransaction();
TestUser user5 = new TestUser("3", "name3");
session.save(user5);
user5.setUserName("name3-update(4)-1");
session.update(user5); // 该条语句可省略
user5.setUserName("name3-update(4)-2");
session.update(user5); // 该条语句可省略
user5.setUserName("name3-update(4)");
// 在调用了save方法后,此时user已经是持久化对象了,被保存在了session缓存当中,
// 这时user又重新修改了属性值,那么在commit时,此时hibernate对象就会拿当前这个user对象和保存在session缓存中的user对象进行比较,
// 如果两个对象相同,则不会发送update语句,否则,如果两个对象不同,则会发出update语句。所以无论多少次update,最终只会发送一次update语句。
session.getTransaction().commit();
session.close();
// [输出LOG]
// Hibernate: insert into test_user (user_name, user_id) values (?, ?)
// Hibernate: update test_user set user_name=? where user_id=?
(5) get();load();list();uniqueResult();等查询语句,如果数据库中有该对象,则该对象也变成了[持久化状态],被session所托管。
session = sessionFactory.openSession();
session.beginTransaction();
TestUser user6 = session.get(TestUser.class, "1");
TestUser user7 = session.load(TestUser.class, "2");
@SuppressWarnings("unchecked")
List<TestUser> user8List = session.createQuery("from TestUser").list();
user6.setUserName("name1-update(5)");
user7.setUserName("name2-update(5)");
user8List.get(2).setUserName("name3-update(5)");
session.getTransaction().commit();
session.close();
// [输出LOG]
// Hibernate: select testuser0_.user_id as user_id1_0_0_, testuser0_.user_name as user_nam2_0_0_ from test_user testuser0_ where testuser0_.user_id=?
// Nov 17, 2017 3:14:20 PM org.hibernate.hql.internal.QueryTranslatorFactoryInitiator initiateService
// INFO: HHH000397: Using ASTQueryTranslatorFactory
// Hibernate: select testuser0_.user_id as user_id1_0_, testuser0_.user_name as user_nam2_0_ from test_user testuser0_
// Hibernate: update test_user set user_name=? where user_id=?
// Hibernate: update test_user set user_name=? where user_id=?
// Hibernate: update test_user set user_name=? where user_id=?
(6) evict();clear();close();将session的缓存对象清空evict()清除指定对象;clear()&close()清除所有对象。它们使对象从[持久化状态]变成[离线状态]。
session = sessionFactory.openSession();
session.beginTransaction();
TestUser user9 = session.get(TestUser.class, "1");
TestUser user10 = session.get(TestUser.class, "2");
user9.setUserName("name1-update(6)");
user10.setUserName("name2-update(6)");
session.evict(user9);
session.clear();
session.getTransaction().commit();
session.close();
// [输出LOG]
// Hibernate: select testuser0_.user_id as user_id1_0_0_, testuser0_.user_name as user_nam2_0_0_ from test_user testuser0_ where testuser0_.user_id=?
// Hibernate: select testuser0_.user_id as user_id1_0_0_, testuser0_.user_name as user_nam2_0_0_ from test_user testuser0_ where testuser0_.user_id=?
(7) update();saveOrUpdate();使对象从[离线状态]转成[持久化状态]。
session = sessionFactory.openSession();
session.beginTransaction();
TestUser user11 = session.get(TestUser.class, "1"); // 持久化状态
user11.setUserName("name1-update(7)");
session.evict(user11); // 离线状态
session.update(user11); // 持久化状态
session.getTransaction().commit();
session.close();
// [输出LOG]
// Hibernate: select testuser0_.user_id as user_id1_0_0_, testuser0_.user_name as user_nam2_0_0_ from test_user testuser0_ where testuser0_.user_id=?
// Hibernate: update test_user set user_name=? where user_id=?
(8) delete();从[瞬时状态]和[持久化状态]都可以删除。
session = sessionFactory.openSession();
session.beginTransaction();
TestUser user12 = new TestUser("1", "name1");
session.delete(user12);
TestUser user13 = session.get(TestUser.class, "2");
session.delete(user13);
session.getTransaction().commit();
session.close();
// [输出LOG]
// Hibernate: select testuser_.user_id, testuser_.user_name as user_nam2_0_ from test_user testuser_ where testuser_.user_id=?
// Hibernate: select testuser0_.user_id as user_id1_0_0_, testuser0_.user_name as user_nam2_0_0_ from test_user testuser0_ where testuser0_.user_id=?
// Hibernate: delete from test_user where user_id=?
// Hibernate: delete from test_user where user_id=?
Hibernate三种状态:瞬时状态、持久化状态、离线状态的更多相关文章
- 简单理解Hibernate三种状态的概念及互相转化
本文描述了Hibernate三种状态的概念及互相转化.Java对象的生命周期中有三种状态,而且互相转化.它们分别是临时状态,持久化状态,以及游离状态. AD:WOT2015 互联网运维与开发者大会 热 ...
- [转]hibernate三种状态详解
本文来自 http://blog.sina.com.cn/u/2924525911 hibernate 三种状态详解 (2013-04-15 21:24:23) 转载▼ 分类: hibernate ...
- hibernate三种状态
转自:http://www.cnblogs.com/xiaoluo501395377/p/3380270.html 学过hibernate的人都可能都知道hibernate有三种状态,transien ...
- hibernate 三种状态的转换
一.遇到的神奇的事情 使用jpa操作数据库,当我使用findAll()方法查处一个List的对象后,给对这个list的实体进行了一些操作,并没有调用update 或者 saveOrUpdate方法,更 ...
- SSH框架之-hibernate 三种状态的转换
一.遇到的神奇的事情 使用jpa操作数据库,当我使用findAll()方法查处一个List的对象后,给对这个list的实体进行了一些操作,并没有调用update 或者 saveOrUpdate方法,更 ...
- Hibernate三种状态,缓存,以及update更新问题
一. Hibernate中对象的三种状态 1. 瞬时状态(transient) 当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,此时该对象只是通过JVM获得了一块 ...
- Hibernate——三种状态的理解
在Hibernate中有三种状态,对这三种状态的深入的理解,能够更好的理解Hibernate的执行机制. 在整个Hibernate中这三种状态是能够进行转换的. 1.Transient Object( ...
- Hibernate三种状态的转换
hibernate的状态 hibernate的各种保存方式的区(save,persist,update,saveOrUpdte,merge,flush,lock)及 对象的三种状态 hibernate ...
- Hibernate三种状态的区分,以及save,update,saveOrUpdate,merge等的使用 引自http://www.blogjava.net/TiGERTiAN/archive/2008/10/25/236519.html
Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久态的对象也称为PO(Persistence Object ...
随机推荐
- Python3学习笔记37-LeetCode刷题
LeetCode中国官网一个用来刷编程题的网站,收录了很多面试题.感觉还是学习到很多.记录一下思路.代码还是要多敲. 建议编写完后直接在LeetCode上运行和提交.提交时会有不同的测试用例来测试代码 ...
- 数据库 MySQL:Windows 环境安装教程
1. 双击 MySQL 安装包,出现安装界面,选择“next” 2. 勾选接受协议,点击“next” 3. 安装类型选择自定义“Custom”,点击“next” 4. 选择安装路径,点击“next” ...
- ubuntu nginx 启动多个Django项目
1.将 /etc/nginx/sites-enabled/ 目录下的nginx默认配置文件default,重命名,例如:default1 2.给每个Django项目添加nginx.conf配置文件,建 ...
- 关于b站爬虫的尝试(一)
由于b站爬虫难度较小(url地址主要通过av定位),我第一的爬虫尝试就选择了b站 以下为初步的尝试. 首先,由于初步统计,b站空视频(已下架或者删除)的比例大概是百分之五十(统计样本基本在前几年的视频 ...
- Linux查找文件内容小技巧
目录 grep ag linux系统查找文件内容最常见的命令有grep和ag grep grep是比较常见的查找命令 # 在当前目录的py文件里查找所有相关内容 grep -a "broad ...
- hbuilder离线打包iOS,xcode开发卡在启动页注意点
1.Display Name的名称与manifest.json中的name保持一致. 2.项目文件夹名.contro.xml中的appid.manifest.json中的id一致
- React-router的使用:标签跳转和编程式跳转
目录: 1.demo:NavLink 标签跳转 2.标签渲染路由组件时,获取url参数 3.编程式跳转 参考文档 1)https://reacttraining.com/react-router/we ...
- PHP处理base64编码字符串
接收前端传过来的base64编码后的字符串, 如果是json字符串, 那么PHP使用file_get_contents('php://input'); 来接收. 本次这里是以post传参的形式传bas ...
- @JsonIgnore等
作用:在json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响. 使用方法:一般标记在属性或者方法上,返回的json数据即不包含该属性. 场景模拟: 需要把一个List< ...
- (十七)线程,connect的第五个参数
采用多线程,将需要处理的后台数据放入子线程,为了能够跨线程调用,一种方法是使用类似线程锁对线程进行保护,另外一种方法使用Qt的信号槽机制.Qt的信号槽机制采用connect函数进行连接,connect ...