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对象的生命周期相关推荐

  1. java session 生命周期_java之hibernate之session中对象的生命周期

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

  2. Spring学习笔记09 - 对象的生命周期

    对象的生命周期 什么是对象的生命周期 一个对象的创建.存活.消亡的一个完整过程. 为什么要学习对象的生命周期? (由程序员控制的 创建对象 就使用new,User user = new User() ...

  3. 【Spring5.x】对象的生命周期、配置文件参数化、自定义类型转换器、后置处理Bean

    工厂高级特性 对象的生命周期 创建阶段 初始化阶段 - InitializingBean.init-method 销毁阶段 - DisposableBean.destroy-method 对象的生命周 ...

  4. [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定...

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  5. python对象的生命周期_python对象的生命周期

    引言 碰到以下问题: 代码1: from Tkinter import * root = Tk() photo = PhotoImage(file=r'E:\workspace\python\111. ...

  6. Hibernate学习之Hibernate注解总结

    Hibernate学习之Hibernate注解总结http://www.bieryun.com/3269.html 一.类级别的注解 @Entity name:表的名字(可选)一般表名和类名相同 必须 ...

  7. java中的的一些生命周期,Java中对象的生命周期

    Java中对象的生命周期 (1) 对象生命周期的开始 对象生命周期开始时,需要为对象分配内存,并且初始化它的实例变量: 对象生命周期结束 Java虚拟机的垃圾回收线程回收对象的内存. (2) 创建一个 ...

  8. 安卓学习笔记06:Activity生命周期与启动模式

    文章目录 零.学习目标 一.Activity生命周期 1.了解Activity生命周期 2.Activity生命周期简化图 (1)Activity存在与否 (2)Activity可见与否 (3)Act ...

  9. python对象的生命周期_(python)通过一个代码例子来分析对象的生命周期 | 学步园...

    最近在学习python,看的是<简明python教程>,写的很是通俗易懂. 在一个类和对象的变量的例子中,看到代码运行结果突然想到在python中对象的生命周期的问题,代码运行结果: #! ...

最新文章

  1. java如何监听以太坊交易
  2. web中常见乱码问题详解
  3. Visual Studio DSL 入门 9---创建状态机的图形符号
  4. mybatis如何防止sql注入
  5. 【java】visualvm 插件 visual gc 使用介绍
  6. Serializable中的serialVersionUID
  7. socket编程 TCP 粘包和半包 的问题及解决办法
  8. [转载] C++11初始化列表与参数列表的作用
  9. a59s刷机包卡刷 oppo_OPPO A59s 5.1 ROM刷机包 ColorOS 精简卡刷包 ROOT权限
  10. html怎么设置火狐ie兼容模式,火狐开启兼容模式 火狐浏览器怎么关闭兼容模式...
  11. matlab 周期卷积,matlab连续时间信号卷积和离散时间信号卷积程序
  12. Widows系统截屏工具
  13. 深入理解Nginx 读书笔记
  14. Ubuntu安装lightdm重启后黑屏
  15. Facebook新模型SEER|图像预训练的内卷
  16. python输入第十个斐波那契数列,0,1,1,2,3,5,8,13,21,34
  17. Trove 3.0.0
  18. Opencv使用imread函数时,读到的数据为空
  19. idea重启端口占用问题
  20. ALM的使用过程及图解

热门文章

  1. Android Studio项目引入外部库注意事项(PullToRefresh)
  2. Eclipse创建struts.xml
  3. Variational Bayes
  4. 脚本实现用户登录显示信息
  5. java thumbnailator 做图片处理
  6. 某企业生产系统升级Linux系统及内核
  7. IBM Watson:用人工智能提升美国零售业消费体验
  8. 2017年2月20日 Adaboost
  9. java中的super限定
  10. 烂泥:kickstart无人值守安装CentOS6.5