学习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语句,自 ...
随机推荐
- loadrunner必用函数web_reg_save_param获取多个符合边界值条件的使用方法
在做loadrunner性能脚本开发时,常常碰见一个需求:符合web_reg_save_param函数中定义的左右边界值的值有多个,而我们的常规写法默认返回的是符合条件的第一个,而有时我们却需要使用后 ...
- JDK动态代理机制
JDK Proxy OverView jdk的动态代理是基于接口的.必须实现了某一个或多个随意接口才干够被代理.并且仅仅有这些接口中的方法会被代理. 看了一下jdk带的动态代理api,发现没有样例实在 ...
- leetcode第28题--Divide Two Integers
Divide two integers without using multiplication, division and mod operator. 分析:题目意思很容易理解,就是不用乘除法和模运 ...
- 功能和形式的反思sql声明 一个
日前必须使用sql语句来查询数据库 但每次你不想写一个数据库中读取所以查了下反射 我想用反映一个实体的所有属性,然后,基于属性的查询和分配值 首先,须要一个实体类才干反射出数据库相应的字段, 可是開始 ...
- 熔断器C#实现
关键词1:保险丝.电闸跳闸.输入密码错误3次则在指定的时间之内禁止登录 关键词2:保护性架构.防御性代码.软件可靠性 实现:https://github.com/fecktty/Circuit_Bre ...
- Ibatis 返回datatable数据类型案例
/// <summary> /// 查询实体 [DataSet数据集] /// </summary> /// <param name="statementNam ...
- iis处理请求随记回顾
----http是无状态的, 每次http请求户不影响,都是独立的:不会记的上次请求: -------iis原理:输入地址--socket封装请求体报文--发送---iis解析封装响应体---返回: ...
- java中实现与.net的format格式化字符串输出
Java中的格式化字符串 System.out.println(MessageFormat.format("name={0}", "张三")); .net中的格 ...
- Euclid Problem - PC110703
欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/uva10104.html 原创:Eucl ...
- C# 各种相对路径
//获取当前可执行的exe的文件名 string str1 = Process.GetCurrentProcess().MainModule.FileNa ...