-临时状态:刚用new语句创建对象,还没有被持久化,并且不处于Session缓存中。处于临时状态的java对象被称为临时对象。

-持久化状态:已经被持久化,并且加入到Session的缓存中。处于持久化状态的java对象被成为持久化对象。

-游离状态:已经被持久化,但不再处于Session的缓存中。处于游离状态的java对象被成为游离对象。

     //对象状态转换的过程
Transaction ts=session.beginTransaction();
User user =new User(); //临时状态
user.setName("tom");
user.setPassword("123456"); session.save(user); //转变为持久化状态
ts.commit(); //持久化状态 session.close(); //转变为游离状态
sessionfactory.close();
System.out.println(user.getName()); //游离状态
临时对象的特征:
-OID为null
-不处于Session的缓存中,也可以说,不被任何一个Session实例关联
-在数据库中没有对应的记录 持久化对象的特征:
-OID不为null
-位于一个Session实例的缓存中,持久化对象总是被一个Session实例关联
-持久化对象和数据库中的相关记录对应
-会根据持久化对象的属性变化,同步更新数据库。
User user=(User)session.get(User.class,1);//获取持久化对象 持久状态
user.setName("jerry");
transaction.commit();
我们发现我们没有执行update语句,却打印了update语句。Hibernate会自动将持久化对象的状态同步到数据库中。 游离对象的特征:
-OID不为null
-不再位于Session的缓存中,也可以说,游离对象不被Session关联
-数据库中有对应的记录

三种状态的转换

    1)临时状态转换持久化状态
-Session的save()方法会将临时状态转换成持久状态。
把要保存的对象放入Session缓存中,使它进入持久化状态。使用映射文件指定的主键生成策略,为持久化对象分配唯一OID。
save方法只是为对象分配UID。我们可以在save方法处打断点。
当我们的主键生成策略为native时,由于我们使用mysql数据库,主键自增,所以执行完save方法后,打印insert语句,mysql数据库为我们对象自增OID
当我们的主键生成策略为incrementt时,increment是由Hibernate维护,先去表中查最大ID然后+1,我们执行完save方法之后,发现打印select查找最大id的语句,
       执行commit时才打印插入语句 2)临时状态转换成游离状态
-将临时状态的对象OID设置为数据库中对应的记录.
User user=new User();
user.setId(1); 3)持久化状态转换成临时状态
第一种:
User user=(User)session.get(User.class,1);//获取持久化对象 持久状态
session.close(); //游离状态
user.setId(null);//临时状态
第二种:
User user=(User)session.get(User.class,1);//获取持久化对象 持久状态
session.evict(user); //游离状态,此方法会将session缓存中清除持久化对象,使其变为游离状态
user.setId(null);//临时状态 4)持久化状态转换成游离状态
第一:调用session的close方法,持久化状态变为游离状态
第二: 调用session的evict()方法方法,将持久状态转变为游离状态 5)游离状态转换成临时状态
只需要将游离状态的对象OID变为null。 6)游离状态转换成持久状态
Session的update()方法使游离状态转换成持久状态。
User user=(User)session.get(User.class,1);//获取持久化对象 持久状态
session.evict(user); //游离状态,此方法会将session缓存中清除持久化对象,使其变为游离状态
session.update(user);

Java对象在Hibernate持久化层的状态的更多相关文章

  1. java对象在hibernate持久层的状态

    站在持久化层的角度,一个java对象在它的生命周期中,可处于以下4个状态之一: 临时状态(transient):刚刚用new语句创建,还没有被持久化,并且不处于Session的缓存中. 持久化状态(p ...

  2. [转]Java 对象锁-synchronized()与线程的状态与生命周期

      线程的状态与生命周期 Java 对象锁-synchronized() ? 1 2 3 4 synchronized(someObject){   //对象锁 } 对象锁的使用说明: 1.对象锁的返 ...

  3. 《精通Hibernate:Java对象持久化技术详解》目录

    图书信息:孙卫琴 电子工业出版社 第1章 Java应用分层架构及软件模型: 1.1 应用程序的分层体系结构 1.1.1 区分物理层和逻辑层 1.1.2 软件层的特征 1.1.3 软件分层的优点 1.1 ...

  4. Hibernate 系列 07 - Hibernate中Java对象的三种状态

    引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...

  5. java框架篇---hibernate入门

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDB ...

  6. Hibernate,Session方法使得java对象进入持久化状态;持久化对象特征

    以下情况java对象进入持久化状态: session.save()方法把临时对象转变为持久化对象. session.load()和session.get()方法得到的对象总是处于持久化状态. sess ...

  7. Hibernate持久化对象状态

    在Hibernate中,持久化对象再被操作过程中分为三个时期.这三个时期和session周期相关. 各自是瞬时(Transient),持久太(persistent)和游离态(Detached) 瞬时状 ...

  8. (转)Hibernate框架基础——Java对象持久化概述

    http://blog.csdn.net/yerenyuan_pku/article/details/52732990 Java对象持久化概述 应用程序的分层体系结构 基于B/S的典型三层架构  说明 ...

  9. Hibernate中Java对象的三种状态

                                                                                     Hibernate中Java对象的三种 ...

随机推荐

  1. 【原创】运维基础之Redis(1)简介、安装、使用

    redis 5.0.3 官方:https://redis.io/ 一 简介 Redis is an open source (BSD licensed), in-memory data structu ...

  2. ApowerMirror投屏(手机投屏电脑、电脑投屏到手机)

    使用步骤    1. 亲测 使用Apowersoft ApowerMirror v1.4.2.zip版本      2.Apowersoft ApowerMirror v1.4.2.zip 解压安装 ...

  3. jsp 异步处理

    一.  概述 异步处理功能可以节约容器线程.你应该将此功能 使用在长时间运行的操作上.此功能的作用是释放正在 等待完成的线程,使该线程能够被另一请求所使用. 二. 编写异步Servlet和过滤器 We ...

  4. SQL入门(3):定义约束/断言assertion/触发器trigger

    本文介绍数据库的完整性 完整性控制程序: 指定规则,检查规则 (规则就是约束条件) 动态约束 intergrity constraint::=(O,P,A,R) O : 数据集合, 约束的对象 ?: ...

  5. python TextMining

    01.Crawling url_request # -*- coding: utf-8 -*- """ Created on Sun Feb 17 11:08:44 20 ...

  6. 项目sql统计

  7. P1169 [ZJOI2007]棋盘制作 DP悬线法

    题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8 \times 88×8大小的黑白相间的方阵,对应八八六十四卦,黑白 ...

  8. Ubuntu16.04下Hadoop的本地安装与配置

    一.系统环境 os : Ubuntu 16.04 LTS 64bit jdk : 1.8.0_161 hadoop : 2.6.4 部署时使用的用户名为hadoop,下文中需要使用用户名的地方请更改为 ...

  9. 理解Python协程:从yield/send到yield from再到async/await

    Python中的协程大概经历了如下三个阶段:1. 最初的生成器变形yield/send2. 引入@asyncio.coroutine和yield from3. 在最近的Python3.5版本中引入as ...

  10. 一个div实现白眼效果

    巧妙利用border和background-clip   <div class="eye"></div> .eye{ width:150px; height ...