当前位置: 首页 > news >正文

(七)Java对象在Hibernate持久化层的状态

一、概述

-临时状态:刚用new语句创建对象,还没有被持久化,并且不处于Session缓存中。处于临时状态的java对象被称为临时对象。

-持久化状态:已经被持久化,并且加入到Session的缓存中。处于持久化状态的java对象被成为持久化对象。

-游离状态:已经被持久化,但不再处于Session的缓存中。处于游离状态的java对象被成为游离对象。

 

临时对象的特征:
        -OID为null
        -不处于Session的缓存中,也可以说,不被任何一个Session实例关联
        -在数据库中没有对应的记录

持久化对象的特征:
        -OID不为null
        -位于一个Session实例的缓存中,持久化对象总是被一个Session实例关联
        -持久化对象和数据库中的相关记录对应
        -会根据持久化对象的属性变化,同步更新数据库。
            User  user=(User)session.get(User.class,1);//获取持久化对象 持久状态
            user.setName("jerry");
            transaction.commit();
        我们发现我们没有执行update语句,却打印了update语句。Hibernate会自动将持久化对象的状态同步到数据库中。


游离对象的特征:
        -OID不为null
        -不再位于Session的缓存中,也可以说,游离对象不被Session关联
        -数据库中有对应的记录 

 

例子:

        //对象状态转换的过程
        Transaction ts=session.beginTransaction();
        User user =new User();                  //临时状态
         user.setName("tom");
         user.setPassword("123456");

        session.save(user);                     //转变为持久化状态
        ts.commit();                            //持久化状态 

        session.close();                        //转变为游离状态
        sessionfactory.close();
        System.out.println(user.getName());     //游离状态 

 

二、三种状态的转换

 

    1)临时状态转换持久化状态
        -Session的save()方法会将临时状态转换成持久状态。
            把要保存的对象放入Session缓存中,使它进入持久化状态。使用映射文件指定的主键生成策略,为持久化对象分配唯一OID。
            save方法只是为对象分配UID。我们可以在save方法处打断点。
            当我们的主键生成策略为native时,由于我们使用mysql数据库,主键自增,所以执行完save方法后,打印insert语句,mysql数据库为我们对象自增OID 

            当我们的主键生成策略为incrementt时,increment是由Hibernate维护,先去表中查最大ID然后+1,我们执行完save方法之后,发现打印select查找最大id的语句,执行commit时才打印插入语句


    2)临时状态转换成游离状态
        -将临时状态的对象OID设置为数据库中对应的记录.
        User user=new User();
        user.setId(1);

    3)持久化状态转换成临时状态
        第一种:
            User  user=(User)session.get(User.class,1);//获取持久化对象 持久状态
            session.close(); //游离状态
            user.setId(null);//临时状态 
        第二种:
            User  user=(User)session.get(User.class,1);//获取持久化对象 持久状态
            session.evict(user); //游离状态,此方法会将session缓存中清除持久化对象,使其变为游离状态
            user.setId(null);//临时状态  

    4)持久化状态转换成游离状态
        第一:调用session的close方法,持久化状态变为游离状态
        第二: 调用session的evict()方法方法,将持久状态转变为游离状态


    5)游离状态转换成临时状态
        只需要将游离状态的对象OID变为null。

    6)游离状态转换成持久状态
        Session的update()方法使游离状态转换成持久状态。
            User  user=(User)session.get(User.class,1);//获取持久化对象 持久状态
            session.evict(user); //游离状态,此方法会将session缓存中清除持久化对象,使其变为游离状态
            session.update(user);

 

  

 

  

 

 

转载于:https://www.cnblogs.com/yuexiaoyun/p/9452273.html

相关文章:

  • Ext JS添加子组件的误区
  • vue 个人积累(使用工具,组件)
  • linux_shell_5_shell特性_正则_1
  • 【Python模块】Python UUID模块
  • 以太坊客户端Geth命令参数详解
  • 寒门难再出贵子(4),一篇值得思考的文章
  • Centos7下自建yum源并同步阿里云镜像的rpm包
  • CentOS 网络设置
  • java集合之linkedList链表基础
  • ReSharper7.1.25.234 注册机
  • Java之word导出下载
  • bootstrap完美实现5列布局
  • 第二章 JAVA语言基本语法————数据类型之间的转换
  • 爱奇艺大数据招聘
  • 记一次element-ui组件开发经历
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【附node操作实例】redis简明入门系列—字符串类型
  • Facebook AccountKit 接入的坑点
  • Next.js之基础概念(二)
  • ng6--错误信息小结(持续更新)
  • NSTimer学习笔记
  • SpringBoot 实战 (三) | 配置文件详解
  • use Google search engine
  • 对象引论
  • 仿天猫超市收藏抛物线动画工具库
  • 服务器从安装到部署全过程(二)
  • 给新手的新浪微博 SDK 集成教程【一】
  • 记一次和乔布斯合作最难忘的经历
  • 精彩代码 vue.js
  • 免费小说阅读小程序
  • 手写双向链表LinkedList的几个常用功能
  • 数据仓库的几种建模方法
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • Hibernate主键生成策略及选择
  • 说说我为什么看好Spring Cloud Alibaba
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (0)Nginx 功能特性
  • (AngularJS)Angular 控制器之间通信初探
  • (LeetCode) T14. Longest Common Prefix
  • (poj1.2.1)1970(筛选法模拟)
  • (多级缓存)缓存同步
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (七)c52学习之旅-中断
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET 发展历程
  • .NET 反射的使用
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .netcore如何运行环境安装到Linux服务器
  • .net的socket示例
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET框架设计—常被忽视的C#设计技巧