Hibernate学习(4)- Hibernate对象的生命周期
1、Hibernate对象的生命周期(瞬时状态、持久化状态、游离状态)
1、瞬时状态(Transient):
使用new操作符初始化的对象就是瞬时状态,没有跟任何数据库数据相关联;
2、持久化状态(Parsistent):
如果对象与Session对象关联起来,且该对象对应到数据库记录,则称该对象处于持久化状态。
3、游离状态(Detached)
Session被关闭或调用了Session的evict或clear方法把它从Session中移除了,则该对象脱离了Session的管理,持久化状态变成游离状态,这表示该对象不在和数据库保持同步,不受hibernate管理。
2、三种状态的比较
Transient:瞬时状态的对象只存在于内存中。
Parsistent:持久状态的对象分别存在于内存、session对象、数据库之中。
Detached:游离状态的对象存在于内存、数据库之中,但不在session对象中。
3、三种状态之间的转换
1、转化路径详解
1)瞬时对象(Transient)
new 创建 (无->Transient) ,即:对象通过构造方法成为瞬时态;
2)持久对象(Persistent)
1.1)get/load (无->Persistent),即:对象可以由session的load或get方法直接成为持久态;
get通过类名和id从数据库读取指定记录,无匹配记录返回null。
load通过类名和id从数据库读取指定记录,无匹配记录抛ObjectNotException异常。
1.2)save/saveOrUpdate/persist (Transient->Persistent) ,即:瞬时态对象可以通过save,saveOrUpdate或persist方法成为持久态;
1.3)update/saveOrUpdate(Detached->Persistent),即:游离态对象则可以通过update,saveOrUpdate成为持久态;
3)游离对象(Detached)
游离态只能由持久态转换而来(Persistent->Detached),通过close、clear、evict方法实现。
evict--把某个对象从session中移除,变为游离态;
clear--把所有对象从session中移除,对象全部变为游离态;
close--关闭session,其中的对象全部变为游离态;
2、几种方法的详解
1、get 与 load
都是从数据库中加载数据封装为java对象,直接变为持久态;
2、save,update与saveOrUpdate
save是将瞬时态转为持久态;
update是将游离态转为持久态;
saveOrUpdate可以说是两者的综合,它执行时先判断对象的状态(主要是通过有无主键判断的),若是自由态,则save,若是游离态,则update;
3、save与persist
两者都是将对象由瞬时态转为持久态,但返回值不同:save返回主键值,而persist不返回;
4、实例,详见注解状态(封装的工具类详见Demo)
package com.demo.test;import org.hibernate.Session; import org.junit.Test;import com.demo.Utils.HibernateUtil; import com.demo.pojo.User;public class SessionTest {@Testpublic void saveTest() {Session session = null;User user = null;try {session = HibernateUtil.currentSession();session.beginTransaction();//创建瞬时状态对象user = new User();user.setName("东方不败");user.setPwd("123456");//user仍是一个瞬态对象//持久状态,user被session管理,并且id有值 -- oid//此时user已变成 持久态对象 session.save(user);//在持久状态下脏数据检查:当提交事务,清理缓存时发现session中的数据与数据库的数据不一致时,会把session的数据更新到数据库//保存以后,再修改对象,会产生多条sql语句,效率降低,所以在save前修改数据user.setName("西方求败");session.getTransaction().commit(); }catch (Exception e) {e.printStackTrace();}finally {HibernateUtil.closeSession();}//close、clear、evict方法都会使持久态对象 变成 游离状态 -- useruser.setName("令狐冲");try {session = HibernateUtil.currentSession();session.beginTransaction();//update使对象变成 持久状态 session.update(user);session.getTransaction().commit(); }catch (Exception e) {e.printStackTrace();}finally {HibernateUtil.closeSession();}}@Testpublic void getTest() {Session session = null;try {session = HibernateUtil.currentSession();//get后变为持久状态//get方法会立即查询该对象:范围(查询不到去下一级查询)从session -> sessionFactory ->数据库//get方法找不到对象,不会有异常,返回nulUser user = session.get(User.class, 7L);System.out.println(user.toString());User user2 = session.get(User.class, 17L);System.out.println(user2);}catch (Exception e) {e.printStackTrace();}finally {HibernateUtil.closeSession();}}@Testpublic void loadTest() {Session session = null;try {session = HibernateUtil.currentSession();//load后变为持久状态(这里加载机制与get不同,稍后我会单独写一篇文章 介绍 get与load 的区别)//对象不存在时,抛出异常User user = session.load(User.class, 7L);System.out.println(user.toString());User user2 = session.load(User.class, 17L);System.out.println(user2.toString());}catch (Exception e) {e.printStackTrace();}finally {HibernateUtil.closeSession();}}@Testpublic void clearTest() {Session session = null;User user = null;try {session = HibernateUtil.currentSession();session.beginTransaction();user = session.get(User.class,7L);System.out.println(user.getName());session.getTransaction().commit(); session.clear();//游离状态,不被session管理,数据库不会被更改user.setName("任我行");System.out.println(user.getName());}catch (Exception e) {e.printStackTrace();}finally {HibernateUtil.closeSession();}}@Testpublic void updateTest() {Session session = null;User user = null;try {session = HibernateUtil.currentSession();session.beginTransaction();//瞬时状态//手动构造对象 也可以修改,但是需要指定所有的属性值,否则,不设置的对象会置空,不建议这样update数据/*user = new User();user.setId(7L);user.setName("盈盈");session.update(user);*///一般这样修改//先去查询user = session.get(User.class,7L);if(user != null) {user.setName("盈盈");session.update(user);}session.getTransaction().commit(); }catch (Exception e) {e.printStackTrace();}finally {HibernateUtil.closeSession();}}@Testpublic void deleteTest() {Session session = null;User user = null;try {session = HibernateUtil.currentSession();session.beginTransaction();//瞬时状态//手动构造一个对象,指定主键是可以删除数据的,不建议这样搞/*user = new User();user.setId(7L);session.delete(user);*///应该这样删除数据//从数据先加载该对象,然后删除,可以避免异常user = session.get(User.class, 7L);if(user != null) {session.delete(user);}session.getTransaction().commit(); }catch (Exception e) {e.printStackTrace();}finally {HibernateUtil.closeSession();}}}
PS:源码地址 https://github.com/JsonShare/hibernate-demo
PS:原文地址 http://www.cnblogs.com/JsonShare/p/8686078.html
转载于:https://www.cnblogs.com/JsonShare/p/8686078.html
Hibernate学习(4)- Hibernate对象的生命周期相关推荐
- java session 生命周期_java之hibernate之session中对象的生命周期
1. session是用来执行对象的crud操作,并且session是对象事务工厂.session是线程级别的,所以生命周期比较短. 2.session中对象的生命周期图: 3.session中对象的 ...
- Spring学习笔记09 - 对象的生命周期
对象的生命周期 什么是对象的生命周期 一个对象的创建.存活.消亡的一个完整过程. 为什么要学习对象的生命周期? (由程序员控制的 创建对象 就使用new,User user = new User() ...
- 【Spring5.x】对象的生命周期、配置文件参数化、自定义类型转换器、后置处理Bean
工厂高级特性 对象的生命周期 创建阶段 初始化阶段 - InitializingBean.init-method 销毁阶段 - DisposableBean.destroy-method 对象的生命周 ...
- [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定...
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- python对象的生命周期_python对象的生命周期
引言 碰到以下问题: 代码1: from Tkinter import * root = Tk() photo = PhotoImage(file=r'E:\workspace\python\111. ...
- Hibernate学习之Hibernate注解总结
Hibernate学习之Hibernate注解总结http://www.bieryun.com/3269.html 一.类级别的注解 @Entity name:表的名字(可选)一般表名和类名相同 必须 ...
- java中的的一些生命周期,Java中对象的生命周期
Java中对象的生命周期 (1) 对象生命周期的开始 对象生命周期开始时,需要为对象分配内存,并且初始化它的实例变量: 对象生命周期结束 Java虚拟机的垃圾回收线程回收对象的内存. (2) 创建一个 ...
- 安卓学习笔记06:Activity生命周期与启动模式
文章目录 零.学习目标 一.Activity生命周期 1.了解Activity生命周期 2.Activity生命周期简化图 (1)Activity存在与否 (2)Activity可见与否 (3)Act ...
- python对象的生命周期_(python)通过一个代码例子来分析对象的生命周期 | 学步园...
最近在学习python,看的是<简明python教程>,写的很是通俗易懂. 在一个类和对象的变量的例子中,看到代码运行结果突然想到在python中对象的生命周期的问题,代码运行结果: #! ...
最新文章
- java如何监听以太坊交易
- web中常见乱码问题详解
- Visual Studio DSL 入门 9---创建状态机的图形符号
- mybatis如何防止sql注入
- 【java】visualvm 插件 visual gc 使用介绍
- Serializable中的serialVersionUID
- socket编程 TCP 粘包和半包 的问题及解决办法
- [转载] C++11初始化列表与参数列表的作用
- a59s刷机包卡刷 oppo_OPPO A59s 5.1 ROM刷机包 ColorOS 精简卡刷包 ROOT权限
- html怎么设置火狐ie兼容模式,火狐开启兼容模式 火狐浏览器怎么关闭兼容模式...
- matlab 周期卷积,matlab连续时间信号卷积和离散时间信号卷积程序
- Widows系统截屏工具
- 深入理解Nginx 读书笔记
- Ubuntu安装lightdm重启后黑屏
- Facebook新模型SEER|图像预训练的内卷
- python输入第十个斐波那契数列,0,1,1,2,3,5,8,13,21,34
- Trove 3.0.0
- Opencv使用imread函数时,读到的数据为空
- idea重启端口占用问题
- ALM的使用过程及图解