时间:2017-1-19 23:00

——Hibernate持久化类的状态

1、持久化类:就是一个实体类与数据库建立了映射。

2、Hibernate为了方便管理持久化类,将持久化类分为了三种状态:
    1)瞬时态:transient(临时态)
    2)持久态:persistent
    3)脱管态:detached(离线态)

——三种持久化对象的状态

1、三种持久化对象的状态
    1)瞬时态
        不存在持久化标识OID,尚未与Hibernate Session关联对象,被认为处于瞬时状态,失去引用将被JVM回收。
        无持久化标识OID,未与Session关联。

    2)持久态
        存在持久化标识OID,与当前Session有关联,并且关联的Session没有关闭,事务未提交。
        存在持久化标识OID,与Session关联。

        持久化对象有自动更新数据库的能力。

    3)脱管态
        存在持久化OID,但没有与当前Session关联,脱管状态改变时Hibernate无法检测。
        存在持久化标识OID,未与Session关联。

2、区分三种持久化对象的状态

示例代码:

public class HibernateDemo1 {
    @Test
    /*
     * 区分持久化对象的三种状态:
     */
    public void fun1(){
        // 1、创建Session
        Session session = HibernateUtils.openSession();
        // 2、开启事务
        Transaction tx = session.beginTransaction();
 
        /*
         * 3、逻辑操作
         */
 
        // 向数据库中保存一本图书
        Book book = new Book(); // 瞬时态:没有唯一标识OID,没有与Session关联
 
        book.setName("Hibernate");
        book.setAuthor("张三");
        book.setPrice(50D);
 
        session.save(book); // book变为一个持久态对象,有唯一标识OID,与Session关联
 
 
        // 4、提交事务
        tx.commit();
        // 5、施放资源
        session.close();
 
        book.setName("Struts2"); // 此时book就是脱管态了,有唯一标识OID,但与Session无关联
    }
}

3、三种状态对象的转换

瞬时态:
    Book book = new Book();
    1)瞬时态 ——> 持久态
        Book book = new Book();
        session.save(book);

    2)瞬时态 ——> 脱管态
        book.setId(1); // 设置OID

持久态:
    Book book = (Book)session.get(Book.class, 1);
    get() / load() / find()  iterate()

    1)持久态 ——> 瞬时态
        session.delete(book); // 删掉之后就没有OID了

    2)持久态 ——> 脱管态
        session.close()
        clear() / evict(book) 将Session中的指定对象删除。

脱管态:
    Book book = new Book();
    book.setId(1);

    1)脱管 ——> 持久
        session.update(book);

    2)脱管 ——> 瞬时
        book.setId(null);

——持久态对象自动更新数据库

示例代码:

    /*
     * 持久态对象自动更新数据库
     */
    public void fun2(){
        Session session = HibernateUtils.openSession();
        Transaction tx = session.beginTransaction();
 
        // 获得一个持久态对象
        Book book = (Book)session.load(Book.class, 1);
 
        book.setName("Struts2");
 
        tx.commit(); // 当提交时会发送一条update语句,自动更新数据库数据,依赖的是Hibernate的一级缓存
        session.close();
    }

——总结

1、Hibernate持久化对象的状态:
    *   瞬时态
        没有唯一标识OID,没有与Session关联
    *   持久态
        有唯一标识OID,与Session关联
    *   脱管态
        有唯一标识OID,没有与Session关联

2、瞬时态对象
    User user = new User()
    瞬时态-->持久态
        session.save(user)
    瞬时态-->脱管态
        user.setId(1)

3、持久态对象
    get() / load()
    持久态-->瞬时态
        session.delete(Object)
    持久态-->脱管态
        session.close() / session.clear() / session.evice()

4、脱管态
    User user = new User();
    user.setId(1)
    脱管态-->瞬时态
        user.setId(null)
    脱管态-->持久态
        save() / saveOrUpdate()

Hibernate之持久化对象的更多相关文章

  1. hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)

    三态的基本概念: 1,  暂时状态(Transient):也叫自由态,仅仅存在于内存中,而在数据库中没有对应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫暂时对象 ...

  2. hibernate中持久化对象的生命周期(转载)

    三态的基本概念 1, 临时状态(Transient):也叫自由态,只存在于内存中,而在数据库中没有相应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象: 2 ...

  3. hibernate中持久化对象的状态

    持久化对象有以下几种状态: 临时对象(Transient): 在使用代理主键的情况下,  OID 通常为 null  不处于 Session 的缓存中 在数据库中没有对应的记录 持久化对象(也叫”托管 ...

  4. Hibernate -- 操作持久化对象

    知识点2: session概述 Session 接口是 Hibernate 向应用程序提供的操纵对数据库的最主要的接口,它提供了基本的保存,更新, 删除和加载Java对象的方法. 知识点3:理解ses ...

  5. hibernate载入持久化对象的两种方式——get、load

    一.get与load对照 在hibernate中get和load方法是依据id取得持久化对象的两种方法.但在实际使用的过程中总会把两者混淆,不知道什么情况下使用get好,什么时候使用load方法效率更 ...

  6. Hibernate的持久化对象

     Hibernate的持久化类 什么是持久化类        1. 持久化类:就是一个Java类(咱们编写的JavaBean),这个Java类与表建立了映射关系就可以成为是持久化类.        * ...

  7. 【Hibernate】持久化对象状态及以及缓存

    一.持久化类状态 1.1 三种持久化对象的状态 1.2 区分三种状态 1.3 三种状态对象转换 1.瞬时态 2.持久态 3.脱管态 4.持久态对象有自动更新数据库的能力 一.持久化类状态 1.1 三种 ...

  8. Hibernate(二)持久化对象的状态

    简介 以前学习Hibernate的笔记,整理一下便发出来了,防止弄丢.有错误的话麻烦各位留言评论,感激不尽. 持久化类 Hibernate完成了从面向对象模型表示的对象至关系模型表示的数据结构的映射, ...

  9. Hibernate的持久化对象配置

    定义Pojo对象和**.hbm.xml文件 -1 对于每一个需要持久化的对象都需要创建一个Pojo类定义,Hibernate要求POJO类定义中必须有一个no-argument的构造方法,便于Hibe ...

随机推荐

  1. HelloWord!

    HelloWorld 1.新建一个文件夹,存放代码 2.新建一个java文件后缀为.java Hello.java (注意后缀 如系统没打开显示后缀需要打开) 3.编写HelloWorld代码 (建议 ...

  2. 【学习笔记】Tensor多维数组和axis的理解

    Tensor多维数组和axis的理解 今天在编写程序的时候一直对于axis=0或等于1搞不明白,这样对于整个numpy或者是tensorflow的基本运算和数据处理都会很模糊,所以花了一些时间来搞清楚 ...

  3. Luogu2839 [国家集训队]middle 题解

    题目很好,考察对主席树的深入理解与灵活运用. 首先看看一般解决中位数的思路,我们二分一个 \(mid\),将区间中 \(\ge mid\) 的数置为 \(1\),小于的置为 \(-1\),然后求区间和 ...

  4. spring的属性注入和构造器注入

    spring在向IOC容器中注入Bean的时候,有三种注入方式: 属性注入构造器注入工厂方法注入平常中用到的前两种方法较多,下面对前两种方法举例.一.属性注入1.创建一个car类,作为注入的bean ...

  5. 静态Web服务器(py版)

    近来,对http协议进行了研究,闲来无事.自己使用python3写了个静态Web服务器,以下是代码: static_Web_sever.py ''' 思路:首先使用socket创建tcp服务器,照旧绑 ...

  6. JavaScript关于对象的一些小知识

    javascript的对象 javascriot(之后用js代替)中基本数据类型之一,是复合类型的数据. 对象在js中应用十分广泛,几乎所有的的事物都是做对象,js的对象拥有自己的属性和方法的数据 在 ...

  7. 进入mysql的学习>从零开始学JAVA系列

    目录 MySQL的学习 什么是MYSQL 安装MYSQL Window安装MYSQL(压缩包版) 什么是MYSQL 安装MYSQL Window安装MYSQL(压缩包版) MYSQL基本指令 DDL ...

  8. Python中print()函数的用法

    print()函数用于打印输出 1.函数语法: print(values,sep=' ',end='\n') sep和end是print()函数常用参数 参数sep是一次打印多个元素时的间隔符号,默认 ...

  9. CSS 即将支持嵌套,SASS/LESS 等预处理器已无用武之地?

    最近,有一则非常振奋人心的消息,CSS 即将原生支持嵌套 -- Agenda+ to publish FPWD of Nesting,表示 CSS 嵌套规范即将进入规范的 FWPD 阶段. 目前对应的 ...

  10. RHCE_DAY07

    文件共享服务FTP介绍 FTP(File Transfet Protocol):文件传输协议 FTP是一种在互联网中基于TCP协议端到端的数据传输协议 基于C/S架构,默认使用20.21号端口 端口2 ...