前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hibernate从入门到放弃(三)----持久化对象

Hibernate从入门到放弃(三)----持久化对象

作者头像
令仔很忙
发布2018-09-14 16:35:46
6840
发布2018-09-14 16:35:46
举报
文章被收录于专栏:令仔很忙令仔很忙

对象的三种状态


对于Hibernate而言,对象状态分为三种:

这里写图片描述
这里写图片描述

瞬时态

当对象刚创建,和Session没有发生任何关系时,当程序运行完成就立刻消失,被称为瞬时态。瞬态对象不会被持久化到数据库中,也不会被赋予持久化标识,如果程序中失去了瞬态对象的引用,瞬态对象将被垃圾回收机制销毁。使用Hibernate Session可以将其变成持久化状态。具体的转化方法如下:

Serializable save(Object obj):将obj对象变为持久化状态,该对象的属性将被保存到数据库。 void persist(Object obj):将object对象转化为持久化状态,该对象的属性将被保存到数据库中。 Serializable save(Object obj,Ojbect pk):将obj对象保存到数据库,保存到数据库时,指定主键值。 void persist(Object obj,Object pk):将obj对象转化为持久化状态,该对象保存到数据库,指定主键值。

持久态

当执行如下代码是,对象变为持久态

代码语言:javascript
复制
Emp e = new Emp();
session.save();

持久态的对象和Session发生了关系,如执行了save、get、query等方法

  • Session中会缓存该对象(Session的缓存叫一级缓存)
  • Session在获取对象是,首先去查找一级缓存,如果没有才查询数据库。
  • Session要负责将持久态对象的变化更新到数据库。(在是flush()的时候更新,tx在提交的时候会自动调用session的flush())。

游离态

Session关闭之后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,他们不再受Hibernate管理。 游离对象的特征。游离对象具有以下特征:

1、不再位于Session的缓存中,也可以说,游离对象不被Session关联。 2、游离对象是由持久化对象转变过来的,因此在数据库中可能还存在与它对应的记录(前提条件是没有其他程序删除了这条记录)。

游离对象与临时对象的相同之处在于,两者都不被Session关联,因此Hibernate不会保证它们的属性变化与数据库保持同步。游离对象与临时对象的区别在于:前者是由持久化对象转变过来的,因此可能在数据库中还存在对应的记录,而后者在数据库中没有对应的记录。 Session的以下方法使持久化对象转变为游离对象:

1、当调用Session的close()方法时,Session的缓存被清空,缓存中的所有持久化对象都变为游离对象。如果在应用程序中没有引用变量引用这些游离对象,它们就会结束生命周期。 2、Session的evict()方法能够从缓存中删除一个持久化对象,使它变为游离状态。当Session的缓存中保存了大量的持久化对象,会消耗许多内存空间,为了提高性能,可以考虑调用evict()方法,从缓存中删除一些持久化对象。但是多数情况下不推荐使用evict()方法,而应该通过查询语言,或者显式的导航来控制对象图的深度。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年05月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 对象的三种状态
    • 瞬时态
      • 持久态
        • 游离态
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档