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 ...
随机推荐
- Web缓存相关知识整理
一.前言 工作上遇到一个这样的需求,一个H5页面在APP端,如果勾选已读状态,则下次打开该链接,会跳过此页面.用到了HTML5 的本地存储 API 中的 localStorage作为解决方案,回顾了 ...
- 在windows环境下利用virtualenv搭建Python虚拟环境
安装Python 安装时只有一点需要注意,一定一定要将Python添加到系统环境变量那一项勾选. 安装 virtualenv 加入系统目录之后,命令行(CMD)下就多了一条命令:pip.用pip可以自 ...
- 第40篇 使用Sublime+MarkDown快速写博客
原文地址:http://blog.laofu.online/2017/06/03/how-use-sublime/ 前端的开发人员应该都知道sublime的神器,今天就说说如何使用sublime结合m ...
- 浅谈C语言指针
下面就几种情况讨论指针. 一.指针和变量 变量是存储空间的别名,访问形式是直接访问. 指针访问内存地址是间接访问. 使用指针访问内存的场合:1.局部变量,参数传递 2.动态分配内存 指针本身也是 ...
- Python中的模块介绍和使用
在Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一 ...
- 关于ASP.NET WebForm与ASP.NET MVC的比较
WebForm的理解 1. WebForm概念 ASP.NETWebform提供了一个类似于Winform的事件响应GUI模型(event-drivenGUI),隐藏了HTTP.HTML.Java ...
- 快学scala
scala 1. scala的由来 scala是一门多范式的编程语言,一种类似java的编程语言[2] ,设计初衷是要集成面向对象编程和函数式编程的各种特性. java和c++的进化速度已经大不如 ...
- 你是否也在学习ES6 Promise时遇到过这个问题?
背景 周末闲来无事,随便翻看了一下阮一峰老师的<ES6 标准入门>第2版,ps:之前在阮一峰老师的官网看过电子版,感觉干货满满,所以就买了纸质版:当看到第16章第4节 'Promise.p ...
- EntityFramework Core映射关系详解
前言 Hello,开始回归开始每周更新一到两篇博客,本节我们回归下EF Core基础,来讲述EF Core中到底是如何映射的,废话少说,我们开始. One-Many Relationship(一对多关 ...
- CLR基础与术语
CLR(Common Language Runtime):一个可由多种编程语言使用的"运行时". CLR的核心功能(内存管理,程序集加载,安全性,异常处理,线程同步等)可由面向CL ...