Hibernate之Java对象的三种状态

一.简述

  本博文大部分的思想和内容引子CSND上名为 FG2006 这位大神的文章,连接地址为:http://blog.csdn.net/fg2006/article/details/6436517。在此表示歉意和深深的谢意。如若各位读者在阅读的过程中发现有任何的纰漏或者错误,请及时之处,本人不胜感激,

  Hibernate中对象有三种状态: 临时状态(Transient)、持久状态(Persistent)、游离状态(Detached)。

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

  持久化状态:已经被持久化,加入到Session的缓存中。处于持久化状态的Java对象被称为持久化对象。

  游离状态:已经被持久化,但不处于session的缓存中。处于游离状态的Java对象被称为游离对象。

二. 具体的描述

2.1 代码描述

@Test
public void status(){
//开启事务
Transaction tx = session.beginTransaction(); //此时customer处于临时状态,此时customer没有持有oid
Customer customer = new Customer();
customer.setName("NNNNNN");
customer.setPhoneNum("223344"); //此时对象持有了oid,与数据库建立的关联关系
int id = (Integer)session.save(customer); //当使用load()或者get()方法的时候,不会发送任何的sql语句,而是直接从session缓存中获取。
Customer customer1 = session.get(Customer.class, id); //结果为true,也就是说拿到的其实是同一个对象
System.out.println(customer == customer1); customer.setName("YYYYYY");
customer1.setName("BBBBBB"); System.out.println(customer1.getName()); System.out.println("customer的Id为:" + customer.getId()); //当事务提交时,实际会发送两条SQL:一条插入,一条更新
tx.commit();
//当session关闭后,customer处于游离状态
session.close(); System.out.println("当customer变为游离状态,依然持有oid: " + customer.getId()); Session session2 = OracleSessionUtils.openSession();
Transaction tx1 = session2.beginTransaction();
//此时customer被重新纳入到session的缓存中, 由游离状态变为持久化状态
session2.update(customer);
customer.setName("MMMMMM");
customer.setName("OOOOOO");
//事务再次提交,实际只会发送一条SQL
tx1.commit();
//customer在此从持久状态变为游离状态
session2.close();
}

2.2 图片描述

  注:本图片也是摘自FG2006这为大神的博文。

2.3 对象状态转换的相关方法描述

get、load、find: 方法的使用上较为类似,get和find方法笔者暂时未发现任何的不同之处。他们都是将数据库中对应Id的数据映射为Java对象,此时对象变为持久化状态。

save: 保存,此时Java对象已经与数据库记录建立的关系。将对象从临时状态的变为持久化状态或者将游离状态的数据变为持久状态。

saveOrUpdate: 保存或者更新,如果没有与数据库记录所对应的oid,则执行保存,如果有,则执行更新。将对象从临时状态的变为持久化状态或者将游离状态的数据变为持久状态。

delete: 删除对象,将对象从持久化状态或者游离状态变为临时状态。

close: 关闭session, 先将session清空,然后再关闭。将对象从持久状态变为临时状态。

clear: 清空session缓存。将对象从持久状态变为临时状态。

evict: 清除指定的对象。将对象从持久状态变为临时状态。

Hibernate之对象的三种状态的更多相关文章

  1. Hibernate持久化对象的三种状态深入理解

    关于OID hibernate缓存是一个map,他会根据OID作为缓存对象的key,我们的映射文件中<id>标签指定的属性值会作为OID 持久化对象的三种状态 为了方便理解,Hiberna ...

  2. 【SSH系列】-- Hibernate持久化对象的三种状态

    在上一篇博文中,小编主要简单的介绍了[SSH系列]--hibernate基本原理&&入门demo,今天小编来继续介绍hibernate的相关知识, 大家知道,Java对象的生命周期,是 ...

  3. Hibernate中对象的三种状态及相互转化

    1. 瞬时状态 (Transient) 当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,如下:  Customer customer=new Customer(“ ...

  4. JavaWeb_(Hibernate框架)Hibernate中对象的三种状态

    对象的三种状态 瞬时状态: 实体 没有id.没有与session关联 持久化状态: 特点:持久化状态对象的任何改变都会同步到数据库中 游离态[也称作托管态]: 实体 有id,没有与session关联 ...

  5. Hibernate中对象的三种状态以及Session类中saveOrUpdate方法与merge方法的区别

    首先,用一张图说明一个对象,在Hibernate中,在调用了不同方法之后对象所处的不同状态 在Hibernate中,一个对象的状态可以被分为如图所示的三种 Transient:瞬时对象,该对象在数据库 ...

  6. hibernate 实体对象的三种状态以及转换关系。

    最新的Hibernate文档中为Hibernate对象定义了四种状态(原来是三种状态,面试的时候基本上问的也是三种状态),分别是:瞬时态(new, or transient).持久态(managed, ...

  7. Hibernate中对象的三种状态即save(),update(),saveOrUpdate()的使用【转】

    当new一个user的时候,是处于瞬时状态 当调用session.save(user)的时候,user对象会放到session里,此时处于持久状态 当提交事务的时候,user对象才会存到DB中 当调用 ...

  8. hibernate实体对象的三种状态:自由状态,持久状态,游离状态.

    自由态与游离态的区别: 当一个持久化对象,脱离开Hibernate的缓存管理后,它就处于游离状态,游离对象和自由对象的最大区别在于,游离对象在数据库中可能还存在一条与它 对应的记录,只是现在这个游离对 ...

  9. hibernate操纵数据库常用方法 及 hibernate对象的三种状态

    在dao层使用hibernate语言来与数据库进行访问,hibernate作为面向对象思想开发的dao层框架其理解也需要以面向对象的思想来看待 使用.hibernate不仅支持使用者使用他提供的对象来 ...

随机推荐

  1. iOS内置音频

    Predefined soundsThere are some predefined system sounds, for the system sound ID in the range 1000 ...

  2. c++ 顺序容器学习

    所谓容器,就是一个装东西的盒子,在c++中,我们把装的东西叫做“元素” 而顺序容器,就是说这些东西是有顺序的,你装进去是什么顺序,它们在里面就是什么顺序. c++中的顺序容器一共有这么几种: vect ...

  3. js 控制框架页面跳转 top.location.herf = "url"

    top.location.href和localtion.href有什么不同 top.location.href=”url”          在顶层页面打开url(跳出框架) self.locatio ...

  4. ubuntu安装rpm包

    ubuntu下的rpm包的安装方法 一般是不能够直接安装的,我们需要一个工具叫alien,先install它吧.然后按照下面择所需. 1.直接安装: alien -i -c filename.rpm ...

  5. (进阶篇)PHP实现用户注册后邮箱验证,激活帐号

    我们在很多网站注册会员时,注册完成后,系统会自动向用户的邮箱发送一封邮件,这封邮件的内容就是一个URL链接,用户需要点击打开这个链接才能激活之前在该网站注册的帐号.激活成功后才能正常使用会员功能. 本 ...

  6. MyBaits使用小结

      Mybatis用like进行模糊查询的时候,配置与所用的数据库有关系,总结了下,具体如下: 1.MySQL :LIKE CONCAT('%',#{empname},'%' ) 或者 LIKE CO ...

  7. jsp基础知识

  8. Your stream was neither an OLE2 stream, nor an OOXML stream.问题的解决

    先说说问题的来源 ,使用NPOI读取Except,先通过流来读取,如果符合要求,就将流保存为文件. 众所周知,流只能读一次,所以在流读取之前需要将流拷贝一份,保存文件的时候使用. protected ...

  9. oracle 报警日志详解

    oracle报警日志是一个非常重要的日志,其有两种实现方法: 1.通过全局表来实现,这种方法有一种缺点,就是在关闭数据库后或者数据库宕机后就不能在使用了 2.通过外部表来实现,这种方法避免了方法一种的 ...

  10. c# 映射对比测试

    c#  映射对比测试(测试对象,测试案例,测试结果) 测试组件对象: TinyMapper-EmitMapper-AutoMapper-NLiteMapper-Handwritten 对比测试案例: ...