持久化对象

再讲持久化对象之前,我们先来理解有关session中get方法与 load方法区别:

简单总结:

(1)如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用,它可以放心的使用代理来延迟加载该对象。

在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,那没办法,只能抛异常。

由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在load时会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理。所以如果你知道该id在数据库中一定有对应记录存在就可以使用load方法来实现延迟加载。

对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查数据库,数据库中没有就返回null。

(2)get不支持lazy,load支持lazy
  
     lazy表示只有在用到的时候才加载数据,
  
     如:Student student =
(Student)session.load(Student.class,1);  //不会发出SQL语句
  
         student.getName();   //这条语句才会发出SQL语句
  
 而使用get方法,Student
student = (Student)session.get(Student.class,1);  //会发出SQL语句

理解OID

用来持久化数据的唯一标识,在小配置里边的id标签中存在

Hibernate的持久化类状态
  持久化类:就是一个实体类 与 数据库表建立了映射.
  Hibernate为了方便管理持久化类,将持久化类分成了三种状态.
    瞬时态 transient (临时态):持久化对象没有唯一标识OID.没有纳入Session的管理
    持久态 persistent :持久化对象有唯一标识OID.已经纳入到Session的管理(持久化持久态对象有自动更新数据库的能力)
    脱管态 detached (离线态):持久化对象有唯一标识OID,没有纳入到Session管理

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

 // 区分持久化对象的三种状态:
public void demo1(){
  // 1.创建Session
  Session session = HibernateUtils.openSession();
  // 2.开启事务
  Transaction tx = session.beginTransaction();
  // 向数据库中保存一本图书:
  Book book = new Book(); // 瞬时态:没有唯一标识OID,没有与session关联.
  book.setName("Hiernate开发");
  book.setAuthor("孙XX");
  book.setPrice(65d);
  session.save(book); // 持久态:有唯一标识OID,与session关联.  
  // 3.事务提交
  tx.commit();
  // 4.释放资源
  session.close();
  book.setName("Struts2开发"); // 脱管态:有唯一的标识,没有与session关联.
}

三种状态对象转换
  瞬时态
    获得:Book book = new Book();
    瞬时--->持久:save(book)  (save()/saveOrUpdate())
    瞬时--->脱管:book.setId(1);
  持久态
    获得:Book book = (Book)session.get(Book.class,1)  (get()/load()/find()/iterate())
    持久--->瞬时:delete(book)  (特殊状态:删除态(被删除的对象,不建议去使用))
    持久--->脱管:session.close()  (close()/clear()/evict())
  脱管态
    获得: Book book = new Book();
        book.setId(1);
    脱管--->持久:session.update()  (update()/saveOrUpdate()/lock())
    脱管--->瞬时:book.setId(null)

持久态对象有自动更新数据库的能力(自动更新数据库的能力依赖了Hibernate的一级缓存)

 // 测试持久态的对象自动更新数据库
public void demo2(){
  Session session = HibernateUtils.openSession();
  Transaction tx = session.beginTransaction();
  // 获得一个持久态的对象.
  Book book = (Book) session.get(Book.class, 1);
  book.setName("Struts2开发");
  // session.update(book);//不需要写这句话,在事务提交后即可完成更新
  tx.commit();
  session.close();
}

先说明下,本文主要是参考博客名为:凌晨三点文章,非常感谢提供这么好的文章!

hibernate框架(3)---持久化对象的更多相关文章

  1. hibernate学习之持久化对象

    Hibernate对其持久化对象实现了缓存管理,来提高系统性能,Hibernate支持两级缓存管理,一级缓存 是由Session提供的,因此它只存在于Session的生命周期中,是Session所内置 ...

  2. Hibernate入门5持久化对象关系和批量处理技术

    Hibernate入门5持久化对象关系和批量处理技术 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv 前言: 前面学习了Hiberna ...

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

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

  4. hibernate框架学习之对象状态

    lHibernate对象共有三种状态 •瞬时状态:瞬时对象 •持久化状态:持久化对象 •托管状态:托管对象 l瞬时对象(Transient Object),简称TO l瞬时对象指的是应用程序创建出来的 ...

  5. hibernate框架的核心对象和相关知识点

    Hibernate架构下图提供了hibernate体系的高层视图: Hibernate全面解决方案: Hibernate核心APIConfiguration负责管理数据库的配置信息.数据库的配置信息包 ...

  6. 使用Hibernate框架来更新对象的注意事项

    Hibernate在更新对象的时候,如果对象的有些属性没有设置,那么在更新的时候,会被默认为空. 特别在更新表单对象的时候. 例子: 如: Department部门类 该部门类有以下属性:  id : ...

  7. Hibernate之深入持久化对象

    Hibernate是一个彻底的O/R Mapping 框架.之所以说彻底,是因为相对于其他的 框架 ,如Spring JDBC,iBatis 需要手动的管理SQL语句,Hibernate采用了完全 面 ...

  8. 【Hibernate步步为营】--核心对象+持久对象全析(二)

    上篇文章讨论了Hibernate的核心对象,在开发过程中经经常使用到的有JTA.SessionFactory.Session.JDBC,当中SessionFactory可以看做数据库的镜像,使用它可以 ...

  9. Hibernate框架用法

    一,Hibernate框架介绍 没有Hibernate之前,使用jdbc来连接数据库时,需要反射加载驱动,再获取连接 在连接上获取sql承载块,传入sql语句执行,获取结果集,解析结果 Hiberna ...

随机推荐

  1. TypeError: 'range' object does not support item assignment处理方法

    vectorsum.py#!/usr/bin/env/pythonimport sysfrom datetime import datetimeimport numpy as np # def num ...

  2. 阿里巴巴Java编码规范插件安装使用指南

    编码规范插件安装使用指南 阿里技术公众号公布的<阿里巴巴Java开发规约>,瞬间引起全民代码规范的热潮,后又发布了PDF的终极版,大家踊跃留言,期待配套的静态扫描工具开放出来. 为了让开发 ...

  3. GitHub学习途径

    之前学习GitHub的一个pdf文件 作者是stormzhang 我觉得那个pdf教的很详细,我还没看完,正在学习中,学到了文件的clon和在本机如何更新GitHub的文件. 在此分享一下 下载链接h ...

  4. Python之路系列笔记

    备注:本套笔记内容来源于互联网,只做学习使用,如有侵权请联系本笔记作者. 资料内容 Python之路(一)——Python 初识 Python之路(二)——基础语法 Python之路(三)——函数 P ...

  5. python删除文件和文件夹

    python中删除文件:os.remove(path) path为文件的路径 import os os.remove(path) python中删除文件夹:shutil.rmtree(path) pa ...

  6. Ubuntu14.04打开cheese却黑屏的问题

    1.安装cheese 2.如发现cheese打开后,摄像头的灯亮了,但是没有图像,黑屏,且按钮都是不可操作状态,这时需要进行一下检测: a.lsusb,看是否有摄像头设备 b.ls /dev/vide ...

  7. 通过iptables添加QoS标记

    1.什么是QoS QoS是一种控制机制,它提供了针对不同用户或者不同数据流采用相应不同的优先级,或者是根据应用程序的要求,保证数据流的性能达到一定的水准.QoS的保证对于容量有限的网络来说是十分重要的 ...

  8. numpy 库简单使用

    numpy 库简单使用 一.numpy库简介 Python标准库中提供了一个array类型,用于保存数组类型的数据,然而这个类型不支持多维数据,不适合数值运算.作为Python的第三方库numpy便有 ...

  9. JSTL配置文件下载地址

    Apache Tomcat安装JSTL 库步骤如下: 从Apache的标准标签库中下载的二进包(jakarta-taglibs-standard-current.zip). 官方下载地址:http:/ ...

  10. 用python处理csv文件

    1.准备csv文件(这里是平安银行的统计表:下载并另存为pingan.csv) >>> from urllib import urlretrieve >>> url ...