博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate从入门到放弃(三)----持久化对象
阅读量:5911 次
发布时间:2019-06-19

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

对象的三种状态


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

你可能感兴趣的文章
我的友情链接
查看>>
一台主机部署多个mysqld实例配置
查看>>
通过案例学调优之--跨库建立物化视图(Materialized View)
查看>>
WordPress新增Page的模版文件
查看>>
JAVAWEB应用的policy安全配置值得深思
查看>>
移动客户端与服务端Session那点秘密
查看>>
vim快速命令
查看>>
在ideal创建新的模块(子项目,同时依赖父模块)
查看>>
对象的序列化和反序列化
查看>>
sql 子查询和连接查询
查看>>
android学习之wifimanager
查看>>
Zabbix3.4部署
查看>>
自动Yum安装DNS服务器
查看>>
手动创建一个recipe
查看>>
【java基础】synchronized,volatile,transient关键字的作用
查看>>
ajax传递数据显示在前端指定位置
查看>>
基于IronFunction搭建的Serverless服务
查看>>
MindManager 2012 出现runtime error的处理办法
查看>>
MySQL慢查询日志分析的配置
查看>>
我的友情链接
查看>>