博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(七)Java对象在Hibernate持久化层的状态
阅读量:6425 次
发布时间:2019-06-23

本文共 2435 字,大约阅读时间需要 8 分钟。

一、概述

-临时状态:刚用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

你可能感兴趣的文章
张小龙莫慌 马化腾莫急 你们要好好的 微信还有时间
查看>>
一些常用软件静默安装参数(nsis,msi,InstallShield ,Inno)
查看>>
部署mimic版本的Ceph分布式存储系统
查看>>
Apache Lucene 6.3.0 Demo
查看>>
MailBee.NET Objects发送电子邮件(SMTP)教程四:发送包含文本和html的电子邮件
查看>>
全国跨高校开发者盛会HACKxFDU承载科技创新的未来
查看>>
Web应用架构入门之11个基本要素
查看>>
Memcache详细介绍
查看>>
Java自定义注解及应用
查看>>
Java内存与垃圾回收调优
查看>>
使用 PyMySQL 连接数据库
查看>>
android 读写文件
查看>>
上传本地文件到GitHub仓库步骤
查看>>
创建cocoapods私有库
查看>>
详解高斯混合模型原理
查看>>
java线程--ReentrantReadWriteLock读写锁
查看>>
10.3 top命令
查看>>
Java并发编程:volatile关键字解析
查看>>
嵌入式文件系统简介(一) —— Linux MTD设备文件系统
查看>>
基于以太坊的汽车充电站【Bosch】
查看>>