hibernate的对象状态分析
开发框架
- springMVC
- hibernate5.0.1
hibernate三种状态
Hibernate定义并支持下列对象状态(state):
临时状态(Transient)
当new一个实体对象后, 这个对象处于临时状态, 即这个对象只是一个保存临时数据的内存区域, 如果没有变量引用这个对象, 则会被jre垃圾回收机制回收. 这个对象所保存的数据与数据库没有任何关系, 除非通过Session的save或者SaveOrUpdate把临时对象与数据库关联, 并把数据插入或者更新到数据库, 这个对象才转换为持久对象.
持久状态(Persistent)
持久(Persistent)的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。 持久(Persistent)的实例可能是刚被保存的,或刚被加载的,无论哪一种,按定义,它存在于相关联的Session作用范围内。 Hibernate会检测到处于持久(Persistent)状态的对象的任何改动,在当前操作单元执行完毕时将对象数据与数据库同步。 开发者不需要手动执行UPDATE。将对象从持久(Persistent)状态变成临时(Transient)状态同样也不需要手动执行DELETE语句。
游离状态(Detached)
当Session进行了Close、Clear或者evict后, 持久化对象虽然拥有持久化标识符和与数据库对应记录一致的值, 但是因为会话已经消失, 对象不在持久化管理之内, 所以处于游离. 游离状态的对象与临时状态对象是十分相似的, 只是它还含有持久化标识.游离状态(Detached)对象如果重新关联到某个新的Session上, 会再次转变为持久(Persistent)的 。
具体可以看下图(图片来自网络)

代码演示
为了演示三种状态的区别,做几个小例子
持久态自动更新演示
如下代码,从数据库里取出catgegory对象,此时的对象处于持久态,通过set方法,更改category的名字,此时Category已经发生变化,为了演示自动更新,我们采用另一个对象,通过save另一个对象,来顺便更新category。注意,此时scriptService save的是一个script对象,会看到hibernate日志,同时也更新了category对象。该实验必须在一个session上下文中进行。
演示代码和hibernate日志
@PostMapping(value = "/groupEdit")
public @ResponseBody RestResult groupEdit(@RequestParam Integer id, @RequestParam String name){
ScriptCategory category = scriptCategoryService.findByName(name);
if (category != null){
return new RestResult(false, "已存在同名分组");
}
category = scriptCategoryService.findById(id);
category.setName(name);
//scriptCategoryService.save(category);
Script script = scriptService.findById(1);
script.setAuthor("llll");
scriptService.save(script);
OperationLogHolder.builder().record(OperationAction.EDIT_SCRIPT_GROUP, "编辑脚本分组: "+ name ,
OperationResult.SUCCESS);
return new RestResult(true, "编辑分组成功");
}

从持久态变为游离态演示
假如说你不想对category进行自动更新,则可以通过将持久态转化为游离态,也就是托管状态,通过session.evict 方法,删除session中的category,此时scriptService.save(script)只会保存自己的对象。
在自己的service行加入以下方法,移除session上下文中的对象,就可以变为游离态。
演示代码和hibernate日志
@Service("scriptService")
@Transactional(readOnly = true)
public class ScriptServiceImpl implements ScriptService {
@Autowired
private EntityManager entityManager;
@Autowired
private ScriptRepo scriptRepo;
//此处省略若干行
@Override
public void sessionEvict(Object object){
Session session = (Session)entityManager.getDelegate();
session.evict(object);
}
}
@PostMapping(value = "/groupEdit")
public @ResponseBody RestResult groupEdit(@RequestParam Integer id, @RequestParam String name){
ScriptCategory category = scriptCategoryService.findByName(name);
if (category != null){
return new RestResult(false, "已存在同名分组");
}
category = scriptCategoryService.findById(id);
category.setName(name);
//scriptCategoryService.save(category);
scriptService.sessionEvict(category);
Script script = scriptService.findById(1);
script.setAuthor("lgggg");
scriptService.save(script);
OperationLogHolder.builder().record(OperationAction.EDIT_SCRIPT_GROUP, "编辑脚本分组: "+ name ,
OperationResult.SUCCESS);
return new RestResult(true, "编辑分组成功");
}

hibernate的对象状态分析的更多相关文章
- 关于hibernate中对象的三种状态分析
一,首先hibernate中对象的状态有三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate().get().load ...
- Hibernate之对象的三种状态
Hibernate之Java对象的三种状态 一.简述 本博文大部分的思想和内容引子CSND上名为 FG2006 这位大神的文章,连接地址为:http://blog.csdn.net/fg2006/ar ...
- 攻城狮在路上(壹) Hibernate(六)--- 通过Hibernate操纵对象(上)
一.Hibernate缓存简介: Session接口是Hibernate向应用程序提供的操纵数据接口的最主要接口,它提供了基本的保存.更新.删除和加载Java对象的方法. Session具有一个缓存, ...
- Hibernate中对象的3种状态:瞬时态、持久态、脱管态
Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久 态的对象也称为PO(Persistence Objec ...
- Hibernate实体对象三种状态
Hibernate实体对象生命周期: 1. 自由状态(Transient,临时状态,瞬态) 在内存中自由存在,与数据库无关,未被Hibernate的Session管理 2. 持久状态(Persiste ...
- Hibernate框架--对象的状态,缓存, 映射
回顾Hibernate第二天: 1. 一对多与多对一 2. 多对多 3. inverse/cascade 4. 关联关系的维护 一对多: <set name="映射的集合属性&quo ...
- 我对hibernate的对象的3种状态的理解
老师的说法 Hibernate中对象的状态 在Hibernate使用中,对象的状态有以下三种 a.临时对象 : 在程序中使用new方式创建的对象 b.持久对象 : 在程序中与sess ...
- 1.1Hibernate持久化类和Hibernate持久化对象状态
一.持久化对象po类 1.po定义 PO,是Persistent Object的缩写,是持久化类.PO是由PO=POJO+hbm映射配置组成. 2.通俗理解 PO类即持久化类,其实就是一个普通的Jav ...
- hibernate 返回对象指定属性,需要返回的列,可以直接返回 对象属性
// hibernate 返回对象指定属性,需要返回的列,可以直接返回 对象属性 @Override public TeamPlan getTeamPlanByBaoMingId(String bao ...
随机推荐
- 教你怎么把iconfont转换成png透明图片
1.进入iconfont图标库,登陆.http://www.iconfont.cn/ 2.选择想要的图标加入购物车. 3.直接选中下载图标为png格式.
- Hybrid App开发之jQuery基础
前言: 前面学习了JavaScript/Html/Css的基础知识,今天学习一下常用js框架jQuery的使用进行快速的开发. JQuery的基本功能: 方位和操作DOM元素 控制页面样式 对页面事件 ...
- DNS域名解析的过程
一.主机解析域名的顺序 1.找缓存 2.找本机的hosts文件 3.找DNS服务器 注意: 配置IP和主机名时,要记得修改/etc/hosts文件,因为有些应用程序在主机内的进程之间通信的时候,会本机 ...
- JavaScript数组基础及实例
js数组 和var i=1;这样的简单存储一样是js中的一种数据结构,是专门用来存储多个数据的一种数据结构. 摘:数组是一组数据的集合,其表现形式就是内存中的一段连续的内存地址,数组名称其实就是连续内 ...
- Jmeter-WINDOWS下的配置部署
前提:已配置安装JDK环境及已部署TOMCAT. 解压apache-jmeter-2.9.zip文件至目录,我的是D:\Program Files目录. 点击我的电脑----属性----高级----环 ...
- js移动端/H5同时选择多张图片上传并使用canvas压缩图片
最近在做一个H5的项目,里边涉及到拍照上传图片的功能以及识别图片的功能,这里对识别图片的功能不做赘述,不属本文范畴.我在做完并上线项目后,同事跟我提了一个要求是可不可以同时选择多张图片上传,我做的时候 ...
- django 调试 监控文件变化 自动刷新浏览器
问题描述:修改html js py等文件后,自动刷新浏览器,解放F5,提高效率 解决办法:使用gulp,使用bowerSync 关于gulp,可以查看系列教程 关于bowerSync,查看官网 关于结 ...
- python 标准库 -- pickle & cPickle
pickle & cPickle pickle 和 cPickle 除了导入名称不一样之外, 使用方法, 均一样. pickle 导入 import pickle cPickle 导入 imp ...
- H.264格式,iOS硬编解码 以及 iOS 11对HEVC硬编解码的支持
H.264格式,iOS硬编解码 以及 iOS 11对HEVC硬编解码的支持 1,H.264格式 网络表示层NAL,如图H.264流由一帧一帧的NALU组成: SPS:序列参数集,作用于一系列连续的编码 ...
- python模块之argparse--参数解析
一.简介: argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块.argparse模块的作用是用于 解析命令行参数,例如python parseTe ...