Hibernate学习笔记(二) — 探索 hibernate 中对象的状态
来源:互联网 发布:ck one 知乎 编辑:程序博客网 时间:2024/06/14 04:29
一、hibernate中对象的状态有三种:
临时、游离和持久化,三种状态转化的方法都是通过session来调用的
什么是持久化?
通俗的讲,就是瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存)
二、三种状态的相互转换
session方法
session.save():该方法可以把一个对象从临时装填转换成持久化状态
session.get():从数据库中根据主键提取出一个对象,该对象就是一个持久化状态的对象
session.update():把一个对象变为持久化对象
session.evict():把一个持久化状态的对象变为脱管状态
session.clear():把所有Hibernate中的持久化状态的对象变为脱管状态的对象
三、测试session的各个方法
public class SessionfatoryTest {SessionFactory factory;Session session ;Transaction transaction;@Beforepublic void init(){factory = HibernateUtils.getSessionFactory();session = factory.openSession();transaction = session.beginTransaction();}/** * 把一个临时对象变为持久化对象 */@Testpublic void testSave(){User user = new User();user.setAge(11);user.setName("aaaa");session.save(user);}@Testpublic void testGet(){User user = (User) session.get(User.class, 1);System.out.println(user);}@Testpublic void testUpdate(){User user = (User) session.get(User.class, 1);user.setAge(102);//session.update(user);//因为user本身就是持久化对象,所以即使不写session.update(),在//transaction.commit()时也会发出SQL语句,因为该对象的数据与//hibernate中的该对象的快照(副本)不一致,在flush()时,就会发出sql}@Testpublic void testUpdate2(){User user = (User) session.get(User.class, 1);session.evict(user);//脱管状态user.setAge(100);session.update(user);//变为持久化状态}@Afterpublic void destory(){transaction.commit();session.close();factory.close();}}
四、Hibernate对象的副本(快照)
每次进行transaction.commit()时,都会进行flush操作,进而进行对象与副本的数据对比,决定是否发送sql语句,比如取出的user的age是10,又改为10,user.setAge(10);那么这样是不会发送sql语句的。
session.flush()
实际上sql的发送时刻,发生在session.flsuh(),在transaction.commit()之前,如果有session.flush()操作,就会发送sql语句,而不再等待transaction.commit().
session.flush()做了哪些事?
在hibernate内部,回去检查所有的持久化对象
1.如果持久化对象是由临时状态转换过来的就发出 insert 语句
2.如果持久化对象是由 get 等方法得到的
3.再次查看副本,如果与副本对照后,一致就不发送sql,如果不一致,就发生update语句
这也就是为什么,不使用session.update() 同样可以发送 update 语句
- Hibernate学习笔记(二) — 探索 hibernate 中对象的状态
- Hibernate学习笔记—Hibernate对象的三种状态
- (hibernate之二)hibernate中对象的状态
- 【Hibernate二】对象的状态
- Hibernate学习笔记 - Hibernate中持久化对象的状态转换规则
- Hibernate学习笔记——Hibernate对象的三种状态
- Hibernate中对象的状态
- hibernate中对象的状态
- Hibernate中对象的状态
- Hibernate学习笔记(2):对象的三种状态
- Hibernate学习笔记 之 持久化对象的状态
- Hibernate学习笔记2--持久化对象的状态
- hibernate学习笔记02----持久化对象的状态转换
- 【学习笔记】Hibernate中对象的状态和转换以及Session的主要方法总结
- J2EE系列之Hibernate4学习笔记(六)--Hibernate中对象的4种状态
- Hibernate中对象状态
- Hibernate学习笔记(2)------------Hibernate数据对象的三种状态
- hibernate的对象状态
- 使用java api操作Hadoop文件
- Memcached简介
- 【动态规划DP,二维动归】poj1651,Multiplication Puzzle
- iOS 第四课 倒计时 设置文本框的删除键
- OC数字和集对象【官方文档】
- Hibernate学习笔记(二) — 探索 hibernate 中对象的状态
- Java之正则表达式【实例解析】
- poj 1274 最大流或二分图,匈牙利算法
- oled屏幕
- Postgis常用函数
- python: 怎样写一个函数把名字大写并变成下面这样——字典与三引号
- leetcode_Delete Node in a Linked List
- Linux - vim按键说明
- Crypto++库在VS 2013中的使用 + 基于操作模式AES加密