学习ORM框架—hibernate(三):跟踪持久化对象状态,掌握对象持久化
准备工作
在上篇博客中学习ORM框架—hibernate(一):初识hibernate,通过简单的实例说明O和R的映射过程。本篇博客将要介绍hibernate中持久化对象的状态,并使用hibernate中的核心接口进行一些JDBC基本操作,来观察状态的转移。
准备工作很重要,需要了解一些专业词汇,所谓专业词汇,意思大家都懂,只是在专业领域里起个专业的名称罢了。所以见到陌生东西时,应该尽可能的消除这种不必要的恐惧。
先了解这个专业词汇
何谓“持久化” 持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中。
持久化对象有三种状态
瞬时对象(Transient Objects):
1. 使用new 操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象,将由垃圾回收机制回收。
2. 没有被session管理
3. 在数据库中没有与之匹配的记录
持久化对象(Persist Objects):
1. 纳入持久化管理器Session统一管理
2. 持久实例是在事务中进行操作的,当事务提交时(在清理缓存时),通过执行SQL语句把内存中的状态同步到数据库中。
3. 在数据库中有与之匹配的记录
离线对象(Detached Objects):
1. Session关闭之后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理。
2. 在数据库中存在与之匹配的记录。
使用hibernate中的核心接口进行一些JDBC基本操作,来观察状态的转移
由transient状态到persist状态,完成insert操作
由detached状态到persist状态,完成update操作
public void testSave1(){
Session session = null;
User user = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
// transient状态
user = new User();
user.setName("zhangsan");
user.setPassword("123");
// persist状态
session.save(user);
//Persistent状态的对象,如果对象的属性发生改变了
//hibernate在清理缓存(脏数据检查)的时候,会和数据库同步
// 和数据库同步,体现在:当commit,开始清理缓存,使用快照比对的方式生成相应的sql语句,先insert,再update。
user.setName("lisi");
//可以显示的调用update方法,但此时为持久状态,调用update没有什么意义
// session.update(user);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
HibernateUtils.closeSession(session);
}
// detached状态
user.setName("wangwu");
try {
session = HibernateUtils.getSession();
session.beginTransaction();
//将detached状态的对象重新纳入session管理
//此时将变为persistent状态的对象
session.update(user);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
HibernateUtils.closeSession(session);
}
}
掌握了状态变化,当处于某个状态时就知道可以进行何种操作了。比如当处于Transient状态,我们只能进行save、update操作或者被回收。
Hibernate持久化是JPA规范的一种实现,还有其他实现方式,比如EJB的持久化,但大同小异,所以学好Hibernate的持久化,再学习其他的就更容易上手和理解了。
学习ORM框架—hibernate(三):跟踪持久化对象状态,掌握对象持久化的更多相关文章
- 学习orm框架及一些看法
首先说说我对现在主流的ORM框架的一些看法: 优点: 让程序员不再关注数据库细节,专心在业务逻辑上,程序员可以不懂数据库就可以开发系统. 让数据库迁移变的非常方便,如果系统需要更改使用的数据库,直接改 ...
- 深入学习Spring框架(三)- AOP面向切面
1.什么是AOP? AOP为 Aspect Oriented Programming 的缩写,即面向切面编程, 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术..AOP是OOP的延续, ...
- 持久化ORM框架——Hibernate与mybatis
最初SUN公司推出了JavaEE服务器端组件模型(EJB),但是由于EJB配置复杂,且适用范围较小,于是很快就被淘汰了.与EJB的失败伴随而来的是另外一个框架的应运而生.他就是至今也比较流行的Hibe ...
- ORM框架Hibernate (一) 对DAO封装和抽象
说明 前面已经给大家介绍了Struts这个框架,Struts是对Web项目的表示层进行了封装,而Hibernate是对Web项目中DAO层进行封装,也即是.NET中我们常用到的D层封装,即对访问数据库 ...
- ORM框架Hibernate (四) 一对一单向、双向关联映射
简介 在上一篇博客说了一下多对一映射,这里再说一下一对一关联映射,这种例子在生活中很常见,比如一个人的信息和他的身份证是一对一.又如一夫一妻制等等. 记得在Java编程思想上第一句话是“一切皆对象”, ...
- 深入浅出学习Spring框架(三):AOP 详解
AOP的英文解释——AOPAspect Oriented Programming面向切面编程.主要目的是通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. 在反 ...
- Blazor和Vue对比学习(进阶2.2.4):状态管理之持久化保存(2),Cookie/Session/jwt
注:本节涉及到前后端,这个系列的对比学习,还是专注在前端Vue和Blazor技术,所以就不撸码了,下面主要学习概念. 我们知道,Http是无状态协议,客户端请求服务端,认证一次后,如果再次请求,又要重 ...
- ORM框架SQLAlchemy学习
一.基本介绍 以下介绍来自维基百科,自由的百科全书. SQLAlchemy是Python编程语言下的一款开源软件.提供了SQL工具包及对象关系映射(ORM)工具,使用MIT许可证发行. SQLAlch ...
- hibernate学习笔记之一 hibernate简介
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架 hibernate可以自动生成SQL语句,自 ...
随机推荐
- RethinkDB创始人教你如何打造一个伟大的互联网产品
关于作者 我叫Slava Akhmechet,本人是 RethinkDB 的创始人之一,RethinkDB是开源,分布式数据库,旨在帮助开发人员与运营商在打造实时应用时处理无结构数据 如何打造一个伟大 ...
- C#备份还原MySql数据库
原文:C#备份还原MySql数据库 项目结束,粘点代码出来让Google或Baidu一下,原因是现在还搜不到这么现成的 调用MySql的工具mysqldump来实现. 类Cmd来实现调用cmd命令, ...
- oracle 数据库技术支持生命周期表
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl4b3Jh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...
- HTML5它contenteditable属性
HTML5它contenteditable属性 1.功能说明 (1)功能:同意用户编辑元素中的内容 (2)说明:是一个布尔值.false是不能编辑,true为可编辑 2.分析实例 (1)content ...
- MPEG-DASH on IIS Practice in Action-attach
1. 准备 IIS Media Service已经安装准备好(如上),注意需要在2008上安装,2003安装不了,或者就算能安装也很麻烦 一个或多个码率的媒体文件如MP4已经准备好 DASH MPD ...
- 从一道数学题弹程序员的思维:数学题,求证:(a+b%c)%c=(a+b)%c
在学校论坛看到这道题目,全忘了的感觉. 如果你是高中的,那我觉得你完全没问题.但是,在这个博客园的圈子,觉得全部人都是程(ban)序(zhuan)员(gong)相关的人员,解决这个问题有点难度,毕竟, ...
- 表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
原文:表单验证的3个函数ISSET().empty().is_numeric()的使用方法 本文就简单讲一下php中表单验证的三个函数,应该比较常用吧,最后给一些示例,请看下文. ISSET();—— ...
- Windows 8.1 store app 开发笔记
原文:Windows 8.1 store app 开发笔记 零.简介 一切都要从博彦之星比赛说起.今年比赛的主题是使用Bing API(主要提到的有Bing Map API.Bing Translat ...
- 小猪Android越来越方式 Day 5 - part 2
小猪的Android入门之路 Day 5 - part 2 Activity片段:Fragment(碎片) ------转载请注明出处 ...
- Retrofit相关资料
高速Android开发系列网络篇之Retrofithttp://www.w3c.com.cn/%E5%BF%AB%E9%80%9Fandroid%E5%BC%80%E5%8F%91%E7%B3%BB% ...