hibernate 持久化对象的生命周期
持久化对象的生命周期
瞬态(自由态)
表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象
持久态
持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象的变化将会被同步到数据库中
session.save() .....到..session.getTransaction().commit();这个过程
托管态(游离态
提交之后的状态
处于持久态的对象,在其对应的Session实例关闭后,此时对象进入游离态。也就是说Session实例是持久态对象的
宿主环境,一旦宿主环境失效,那么持久态对象进入游离状态
游离态和自由态的区别:
1 游离态对象可以再次与Session进行关联而成为持久态对象。
2 自由态对象在数据库中没有数据与其对应,但是游离态对象在数据库中有数据与其对应,只不过当前对象不在
Session环境中而已。从对象的是否有主键值可以做简单的判断。
User user = new User();
user.setUsername("tom");
// 自由态的时候还是没有id的
Session session = HibernateUtil.getSession(); session.beginTransaction();
session.save(user); session.getTransaction().commit();
syso(user.getId()); //执行save之后关闭session,这个时候就已经有id了
load和get方法
1 get和load方法都是利用对象的主键值获取相应的对象,并可以使对象处于持久状态。
2 延迟加载...load方法获取对象时不会立即执行查询操作,而是在第一次使用对象是再去执行查询
操作。使用时有范围的,要在session的关闭之前,因为使用的时候才回去查,就要有session
如果查询的对象在数据库中不存在,load方法返回值不会为null,在第一次使用
时抛出org.hibernate.ObjectNotFoundException异常。
3 使用get方法获取对象时会立即执行查询操作,并且对象在数据库中不存在时返回null值。
Session session = HibernateUtil.getSession(); session.beginTransaction();
User user = (user)session.get(User.class,1);
//这个时候执行了select方法
syso(user == null);// 当user不存在时输出true
session.getTransaction().commit();
Session session = HibernateUtil.getSession(); session.beginTransaction();
User user = (user)session.load(User.class,1);
//这个时候不会执行select方法 当使用的时候
//syso(user.getUsername())才会去查询
syso(user == null);/* 当user不存在时false,永远都不会是null,因为有user的代理对象
,第一次使用的时候会出现异常*/
session.getTransaction().commit();
save和persist方法
1 save和persist方法都是将持久化对象保存到数据库中
2 save方法成功执行后,返回持久化对象的ID
3 persist方法成功执行后,不会返回持久化对象的ID,persist方法是JPA中推荐使用的方法
hibernate是JPA的一种实现
save和update方法
save方法是将自由态的对象进行保存
update方法是将游离态的对象进行保存
update和saveOrUpdate方法
如果一个对象是游离态或持久态,对其执行update方法后会将对象的
修改同步到数据库中,如果该对象是自由态,则执行update方法是没有作用的
在执行saveOrUpdate方法时该方法会自动判断对象的状态,如果为
自由态则执行save操作,如果为游离态或持久态则执行update操作
update和merge方法
如果持久化对象在数据库中存在,使用merge操作时进行同步操作。
如果对象在数据库不存在,merge对象则进行保存操作
如果对象是游离状态,经过update操作后,对象转换为持久态。
但是经过merge操作后,对象状态依然是游离态
自由态交给merge就是insert
游离态交给merge就是update,但是之前会根据id去数据库查询一下
clear 和 flush
clear方法是将Session中对象全部清除,当前在Session中的对象
由持久态转换为游离态。flush方法则是将持久态对
象的更改同步到数据库中。
session.flush()方法的作用其实就是让session的缓存的数据(session就是一级缓存)刷入到数据库里面去,让数据库同步,你可以更简单的理解就是,强制让session的数据和数据库的数据同步,而不是什么清除缓存,我就奇怪了,清除缓存明明是session.clear()方法,在使用flush方法一般之前都是对一个对象进行CRUD的操作,然后你调用flush方法,就及时的同步到数据库里面去,其实session.flush()方法用的最好的一块是在处理大量数据的时候我们可以控制数量,比如,我们要存储1万个对象,我们可以这样做
if(i%20==0){
session.flush();//强制同步数据到数据库里面去
session.clear();清除缓存
}
这样提高工作性能。
hibernate 持久化对象的生命周期的更多相关文章
- hibernate 持久化对象的生命周期 2.1
持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象 ...
- hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)
三态的基本概念: 1, 暂时状态(Transient):也叫自由态,仅仅存在于内存中,而在数据库中没有对应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫暂时对象 ...
- hibernate中持久化对象的生命周期(转载)
三态的基本概念 1, 临时状态(Transient):也叫自由态,只存在于内存中,而在数据库中没有相应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象: 2 ...
- Hibernate实体对象的生命周期(三种状态)
瞬时状态(Transient) 通过new创建对象后,对象并没有立刻持久化,它并未与数据库中的数据有任何关联,此时Java对象的状态为瞬时状态. Session对于瞬时状态的Java对象是一无所知的, ...
- [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Hibernate学习(4)- Hibernate对象的生命周期
1.Hibernate对象的生命周期(瞬时状态.持久化状态.游离状态) 1.瞬时状态(Transient): 使用new操作符初始化的对象就是瞬时状态,没有跟任何数据库数据相关联:2.持久化状态(Pa ...
- Hibernate中Java对象的生命周期
一个对象的出生源于我们的一个new操作,当我们使用new语句创建一个对象,这个对象的生命周期就开始了,当我们不在有任何引用变量引用它,这个对象就的生命就此结束,它占用的内存就可以被JVM的垃圾回收器回 ...
- Spring,SpringMVC,MyBatis,Hibernate,Servlet的生命周期,jsp有哪些内置对象,Tomcat,Cookie和Session的作用以及区别,oracle,MYSQL等面试题总结
1. 什么是Spring,谈谈你对Spring的理解 Spring是我们JAVA开发人员在搭建后台时选用的一个轻量级的开源框架,Spring框架目前也是功能丰富,十分优秀企业级采用最多的一个框架. S ...
- java之hibernate之session中对象的生命周期
1. session是用来执行对象的crud操作,并且session是对象事务工厂.session是线程级别的,所以生命周期比较短. 2.session中对象的生命周期图: 3.session中对象的 ...
随机推荐
- onActivityResult方法不执行,什么原因?
原因: public void OnOpenPlayersActivity(View view) { Intent intent = new Intent(); intent.setClass(g ...
- Elasticsearch的几种架构(ELK,EL,EF)性能对比测试报告
Elasticsearch的几种架构性能对比测试报告 1.前言 选定了Elasticsearch作为存储的数据库,但是还需要对Elasticsearch的基础架构做一定测试,所以,将研究测试报告输出如 ...
- Linux服务器上的tomcat中部署web项目
首先了解一下下面几个概念,讲得不太准确:1.JVMJVM是class以及jar(实际上就是很多个class压缩在一起)的运行环境,特征就是java和javaw命令,通过这两个命令,你可以执行class ...
- [原创]java WEB学习笔记27:深入理解面向接口编程
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- [原创] Windows下Eclipse连接hadoop
1 下载hadoop-eclipse-plugin :我用的是hadoop-eclipse-plugin1.2.1 ,百度自行下载 2 配置插件:将下载的插件解压,把插件放到..\eclipse\pl ...
- 算法(Algorithms)第4版 练习 1.3.37
package com.qiusongde.creative; import com.qiusongde.Queue; import edu.princeton.cs.algs4.StdOut; pu ...
- Hive split分割后获取最后一段
----------------------------------------- 如果只看解决方法,直接看最后... ---------------------------------------- ...
- MS-SQL charindex的用法
select * from table_a where charindex('a',id)>0 or charindex('b',id)>0 table_a 表中 id字段中含有" ...
- css3 点击爆炸下落
代码][JavaScript]代码 $(document).ready(function() { // Generate the clips. In this case ...
- 洛谷p3369 treap
这是一个treap裸题,还可以用splay,替罪羊树,线段树等等写 treap是树和堆结合,可以方便的在O(log(n))期望时间内进行以下操作,因此treap又叫做名次树 插入x数 删除x数(若有多 ...