hibernate的对象状态分析

时间:2022-12-20 10:49:12

开发框架

  • 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)的 。

具体可以看下图(图片来自网络)

hibernate的对象状态分析

代码演示

为了演示三种状态的区别,做几个小例子

持久态自动更新演示

如下代码,从数据库里取出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, "编辑分组成功");
}

hibernate的对象状态分析

从持久态变为游离态演示

假如说你不想对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的对象状态分析的更多相关文章

  1. 关于hibernate中对象的三种状态分析

    一,首先hibernate中对象的状态有三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate().get().load ...

  2. Hibernate之对象的三种状态

    Hibernate之Java对象的三种状态 一.简述 本博文大部分的思想和内容引子CSND上名为 FG2006 这位大神的文章,连接地址为:http://blog.csdn.net/fg2006/ar ...

  3. 攻城狮在路上(壹) Hibernate(六)--- 通过Hibernate操纵对象(上)

    一.Hibernate缓存简介: Session接口是Hibernate向应用程序提供的操纵数据接口的最主要接口,它提供了基本的保存.更新.删除和加载Java对象的方法. Session具有一个缓存, ...

  4. Hibernate中对象的3种状态:瞬时态、持久态、脱管态

    Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久 态的对象也称为PO(Persistence Objec ...

  5. Hibernate实体对象三种状态

    Hibernate实体对象生命周期: 1. *状态(Transient,临时状态,瞬态) 在内存中*存在,与数据库无关,未被Hibernate的Session管理 2. 持久状态(Persiste ...

  6. Hibernate框架--对象的状态,缓存, 映射

    回顾Hibernate第二天: 1.  一对多与多对一 2. 多对多 3. inverse/cascade 4. 关联关系的维护 一对多: <set name="映射的集合属性&quo ...

  7. 我对hibernate的对象的3种状态的理解

    老师的说法 Hibernate中对象的状态    在Hibernate使用中,对象的状态有以下三种    a.临时对象 : 在程序中使用new方式创建的对象    b.持久对象 : 在程序中与sess ...

  8. 1&period;1Hibernate持久化类和Hibernate持久化对象状态

    一.持久化对象po类 1.po定义 PO,是Persistent Object的缩写,是持久化类.PO是由PO=POJO+hbm映射配置组成. 2.通俗理解 PO类即持久化类,其实就是一个普通的Jav ...

  9. hibernate 返回对象指定属性,需要返回的列&comma;可以直接返回 对象属性

    // hibernate 返回对象指定属性,需要返回的列,可以直接返回 对象属性 @Override public TeamPlan getTeamPlanByBaoMingId(String bao ...

随机推荐

  1. &lbrack;转&rsqb;ios push

    转:http://blog.csdn.net/showhilllee/article/details/8631734 APNS的推送机制 首先我们看一下苹果官方给出的对ios推送机制的解释.如下图 P ...

  2. 【VBS】vbs指定编码保存文本文件(含xml、ini什么的)

    本文还是折腾安装包期间衍生出来的产物. 我那安装包在安装期间有这个动作: - 让用户填写一些信息,待安装完成后把这些信息写入软件安装目录中的指定ini.xml文件中 上文说的是如何用vbs写ini,i ...

  3. SQL事务回滚样例

    选课系统,当同意学号选课数量超过则回滚事务,符合条件则正常插入数据 --开始一个事务处理Begin Tran T1 --执行插入操作insert into Courselist values('201 ...

  4. &commat;JoinColumn

    @OneToOne注释只能确定实体与实体的关系是一对一的关系,不能指定数据库表中的保存的关联字段.所以此时要结合@JoinColumn标记来指定保存实体关系的配置. @JoinColumn与本书上一章 ...

  5. 在 CentOS 上安装和配置 OpenNebula

    转自:http://www.aikaiyuan.com/4889.html 我们提到的云计算一般有三种类型:软件即服务(Software as a Service, SaaS),平台即服务(Platf ...

  6. SEO中最常见的几个错误

    昨天答应给放点干活的,今天如约而来! SEO中最常见的几个错误: 1.关键词   人们往往想当然的选择自己喜欢的keyword,但用户在搜索时,根本不会使用它们.比方说,你选择"优化果酱&q ...

  7. Codeforces Round &num;216 &lpar;Div&period; 2&rpar; E&period; Valera and Queries 树状数组 离线处理

    题意:n个线段[Li, Ri], m次询问, 每次询问由cnt个点组成,输出包含cnt个点中任意一个点的线段的总数. 由于是无修改的,所以我们首先应该往离线上想, 不过我是没想出来. 首先反着做,先求 ...

  8. Linux档案种类与扩展名&lpar;2013&period;09&period;03&rpar;

    档案种类: 正规档案(regular file ):    第一个字符为 [ -],例如 [-rwxrwxrwx ].另外,依照档案的内容,又大略可以分为:     纯文本档(ASCII)     二 ...

  9. 【Swift】学习笔记&lpar;四&rpar;——设置&lpar;Collection&rpar;

    Swift和其他语言也提供了两种类型的集合:数组和字典 数组:数组用来按顺序存储同样类型的数据,swift规定它是类型安全的,每个数组都有自己的类型也就是其它语言所说的泛型. 创建数组: 1.var ...

  10. select2的设置选中

    select2插件设置选中值并显示的问题 在select2中,要想设置指定值为选中状态并显示: $("#select2_Id").val("XXXXX").se ...