Hibernate从入门到放弃(三)----持久化对象-阿里云开发者社区

开发者社区> 数据库> 正文

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

简介:

对象的三种状态


    对于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对象转化为持久化状态,该对象保存到数据库,指定主键值。

持久态

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

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()方法,而应该通过查询语言,或者显式的导航来控制对象图的深度。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章