java之hibernate之session中对象的生命周期
1. session是用来执行对象的crud操作,并且session是对象事务工厂。session是线程级别的,所以生命周期比较短。
2.session中对象的生命周期图:

3.session中对象的状态
瞬时状态
持久状态
游离状态
4.对象的生命周期一:
new---->瞬时状态----->save------>持久状态----->close----->游离状态
public class HibernateTest {
@Test
public void testSession1(){
Session session = null;
Transaction tx = null;
User user=null;
try {
//user处于瞬时状态,session没有管理该对象
user = new User();
user.setName("小菜");
user.setAge(40);
session = HibernateUtil.getSession();
//获取事务
tx = session.getTransaction();
//开启事务
tx.begin();
//被保存后 user处于持久状态,session开始管理该对象
//处于持久状态的数据 session会进行脏数据检查
session.save(user);
user.setName("菜10");
//提交事务----提交事务后进行脏数据检查后 会进行数据同步
tx.commit();
} catch (Exception e) {
if(tx!=null)
tx.rollback();
}finally {
HibernateUtil.close();
}
//user处于游离状态 session不管理user
System.out.println("user==="+user);
}
}
5.对象的生命周期二:
get---->直接进入持久化状态---->clear------>游离状态------>update------->持久化状态------->delete------->瞬时状态
@Test
public void testSession2(){
Session session = null;
Transaction tx = null;
User user=null;
try {
session = HibernateUtil.getSession();
//获取事务
tx = session.getTransaction();
//开启事务
tx.begin();
//直接从数据库中获取数据 数据处于持久状态
user = (User)session.get(User.class, 3);
//清理session中的所有数据 user不被session管理 处于游离状态
session.clear();
user.setName("卫斯理");
user.setAge(90);
//执行更新操作后 user处于持久状态
session.update(user);
//执行delete处于瞬时状态
session.delete(user);
tx.commit(); } catch (Exception e) {
if(tx!=null)
tx.rollback();
}finally { HibernateUtil.close();
}
//user处于瞬时状态 session不管理user
System.out.println("user==="+user);
}
6.对象生命状态总结
瞬时状态:session中没有,数据库中也没有
持久状态:session中有,数据库中也有
游离状态:session中没有,数据库中有
7.在执行对象的删除和对象的更新时,应遵循对象的生命周期状态图,也就是应该先查询后更新或删除。
java之hibernate之session中对象的生命周期的更多相关文章
- JAVA面试题:Spring中bean的生命周期
Spring 中bean 的生命周期短暂吗? 在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一 ...
- SOUI中对象的生命周期管理
C++程序员最难的一环就是处理内存泄漏. 很多情况下,一个对象在一个模块里分配了内存,忘记了释放,或者在另一个模块里释放都会导致内存相关的问题. SOUI中大部分暴露在应用层的对象都使用类似COM的引 ...
- [原创]java WEB学习笔记47:Servlet 监听器简介, ServletContext(Application 对象), HttpSession (Session 对象), HttpServletRequest (request 对象) 监听器,利用listener理解 三个对象的生命周期
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- hibernate学习系列-----(3)Session 缓存和持久化生命周期以及Session 基本操作
Session缓存原理 为了能够在控制台更好的看到我们的hibernate干了些什么,可以在hibernate.cfg.xml文件中写入如下配置: <!-- print all generate ...
- 第四章 Spring.Net 如何管理您的类___对象的生命周期链
各位,实在不好意思,因为有事,博客几天没更新了.前面有童鞋提到,配置 Objects.xml 路径的相关问题,这些东西是 IResource 接口的一些内容.在下一章会详细介绍. 传统的Net应用中, ...
- Hibernate中Java对象的生命周期
一个对象的出生源于我们的一个new操作,当我们使用new语句创建一个对象,这个对象的生命周期就开始了,当我们不在有任何引用变量引用它,这个对象就的生命就此结束,它占用的内存就可以被JVM的垃圾回收器回 ...
- [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Hibernate 通过 Session 操纵对象
Session 概述 •Session 接口是 Hibernate 向应用程序提供的操纵数据库的最主要的接口, 它提供了基本的保存, 更新, 删除和加载 Java 对象的方法. •Session 具有 ...
- Hibernate学习(4)- Hibernate对象的生命周期
1.Hibernate对象的生命周期(瞬时状态.持久化状态.游离状态) 1.瞬时状态(Transient): 使用new操作符初始化的对象就是瞬时状态,没有跟任何数据库数据相关联:2.持久化状态(Pa ...
随机推荐
- js如何将汉字转化为拼音
github地址,上面有封装好的转换工具:https://github.com/sxei/pinyinjs 里面有几个库,根据功能,库的文件大小也不一样,可以根据需求去引入使用. 里面封装好了方法: ...
- 树莓派从烧录系统到通过wifi远程访问(新树莓派配置,无显示器、网线、键盘)
本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/raspberry_from_install_to_remote_ ...
- Pytest权威教程(官方教程翻译)
Pytest权威教程01-安装及入门 Pytest权威教程02-Pytest 使用及调用方法 Pytest权威教程03-原有TestSuite的执行方法 Pytest权威教程04-断言的编写和报告 P ...
- element ui input 输入时触发事件
<el-form-item label="客户名" :label-width="labelWidth"> <el-input v-model= ...
- JavaWeb项目启动过程与ServletContext
ServletContext的官方名称叫Servlet上下文,服务器会为每一个工程创建一个对象,这个对象就是ServletContext.一个项目只有一个ServletContext对象,工程内的所有 ...
- Java_jdbc 基础笔记之十一数据库连接 (通用的查询方法)
鉴于之前的查询方法,在这里我们可以写一个通用的方法 /** * 鉴于 student.和customer查询的方法有好多相同之处,在此可以写一个通用的方法 */ public <T> T ...
- Nginx系列 | [转]Nginx 上传文件:client_max_body_size 、client_body_buffer_size
原文:http://php-note.com/article/detail/488 client_max_body_size client_max_body_size 默认 1M,表示 客户端请求服务 ...
- python去除BOM头\ufeff等特殊字符
1.\ufeff 字节顺序标记 去掉\ufeff,只需改一下编码就行,把UTF-8编码改成UTF-8-sigwith open(file_path, mode='r', encoding='UTF-8 ...
- Ingress-nginx 部署使用
Ingress-nginx 部署使用 一.Ingress 简介 在Kubernetes中,服务和Pod的IP地址仅可以在集群网络内部使用,对于集群外的应用是不可见的.为了使外部的应用能够访问集群内 ...
- Android: 判断当前手机品牌(转)
参考资料 Android判断手机ROM 正文 有时候需要判断手机系统的ROM,检测ROM是MIUI.EMUI还是Flyme,可以使用getprop命令,去系统build.prop文件查找是否有对应属性 ...