hibernate框架(3)---持久化对象
持久化对象
再讲持久化对象之前,我们先来理解有关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)---持久化对象的更多相关文章
- hibernate学习之持久化对象
Hibernate对其持久化对象实现了缓存管理,来提高系统性能,Hibernate支持两级缓存管理,一级缓存 是由Session提供的,因此它只存在于Session的生命周期中,是Session所内置 ...
- Hibernate入门5持久化对象关系和批量处理技术
Hibernate入门5持久化对象关系和批量处理技术 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv 前言: 前面学习了Hiberna ...
- (转)Hibernate框架基础——Java对象持久化概述
http://blog.csdn.net/yerenyuan_pku/article/details/52732990 Java对象持久化概述 应用程序的分层体系结构 基于B/S的典型三层架构 说明 ...
- hibernate框架学习之对象状态
lHibernate对象共有三种状态 •瞬时状态:瞬时对象 •持久化状态:持久化对象 •托管状态:托管对象 l瞬时对象(Transient Object),简称TO l瞬时对象指的是应用程序创建出来的 ...
- hibernate框架的核心对象和相关知识点
Hibernate架构下图提供了hibernate体系的高层视图: Hibernate全面解决方案: Hibernate核心APIConfiguration负责管理数据库的配置信息.数据库的配置信息包 ...
- 使用Hibernate框架来更新对象的注意事项
Hibernate在更新对象的时候,如果对象的有些属性没有设置,那么在更新的时候,会被默认为空. 特别在更新表单对象的时候. 例子: 如: Department部门类 该部门类有以下属性: id : ...
- Hibernate之深入持久化对象
Hibernate是一个彻底的O/R Mapping 框架.之所以说彻底,是因为相对于其他的 框架 ,如Spring JDBC,iBatis 需要手动的管理SQL语句,Hibernate采用了完全 面 ...
- 【Hibernate步步为营】--核心对象+持久对象全析(二)
上篇文章讨论了Hibernate的核心对象,在开发过程中经经常使用到的有JTA.SessionFactory.Session.JDBC,当中SessionFactory可以看做数据库的镜像,使用它可以 ...
- Hibernate框架用法
一,Hibernate框架介绍 没有Hibernate之前,使用jdbc来连接数据库时,需要反射加载驱动,再获取连接 在连接上获取sql承载块,传入sql语句执行,获取结果集,解析结果 Hiberna ...
随机推荐
- spring multipart源码分析:
1.MultipartResolver MultipartResolver接口提供了spring mvc的上传视图,MultipartResolver实例在请求转交给handlermapping之前. ...
- SRILM的使用及平滑方法说明
1.简介 SRILM是通过统计方法构建语言模型,主要应用于语音识别,文本标注和切分,以及机器翻译等. SRILM支持语言模型的训练和评测,通过训练数据得到语言模型,其中包括最大似然估计及相应的平滑算法 ...
- 修改oracle的字符集操作方法
cmd环境下进行以下命令行的操作--连接sqlplus / as sysdba--命令行shutdown immediate; startup mount ALTER SYSTEM ENABLE RE ...
- Chapter5_初始化与清理_this关键字
this关键字是Java中一类很特殊的关键字,首先它只能在方法内使用,用来表示调用这个方法的对象,在这一点上this和其他对对象的引用的操作是相同的.我们之所以可以在方法内部访问到它是因为编译器在方法 ...
- Scrum冲刺阶段5
成员今日完成的任务 人员 任务 何承华 学习后端设计 陈宇 后端设计 丁培辉 学习后端设计 温志铭 日程添加界面设计(后半段设计) 杨宇潇 日程添加界面设计(后半段设计) 张主强 服务器构建学习 成员 ...
- mysql自定义时间段分组
说明:一下是自定义7天为一个时间段的分组统计 select datediff(ms_time, '开始时间') div 7 as time , count(*) count,sum(money) mo ...
- css隐藏多余的文字并出现省略号
<meta charset="utf-8" /> <style> .txt{ width:200px; border:1px solid #ddd; ove ...
- 28. 实现strStr()
实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不存在,则返 ...
- mybatis-plus 3.X 配置
官网配置参数说明地址:https://mp.baomidou.com/config/#logicdeletevalue 本地配置:yml mybatis-plus: mapper-locations: ...
- fastjson 序列化,反序列化Map对象的顺序问题
使用JSONObject 读取JSON字符串时,读取出来的数据,通过变量时是无序的. 但是业务希望返回是顺序的. String str="{name:\"A\",add ...