Hibernate实体对象的生命周期(三种状态详解)

Hibernate生命周期会经历三种不同的状态:

    1.Transient(瞬态):实体对象在内存是自由存在的,即与数据库中的数据没有任何关系.换句话说就是:该实体从未与任何持久化上下文关联过,它没有持久化标识.例如:    
     

//创建一个Transient对象
 User user=new User();
user.setName("username");
 user.setPassword("password");
 //此时的user为一个Transient对象,因为没有与任何数据库的任何记录相关联.

     特征:

  • 与数据库中的记录没有任何关系,即没有与其相关联的数据库记录.
  • 与session没有任何关系.即没有通过session对象的实例对其进行任何持久化的操作.

   

    2.Persistent(持久态):该实体对象处于Hibernate框架所管理的状态,即这个实体对象与Session对象的实例相关联.例如:

//创建一个Transient对象
User user=new User();
 user.setName("username");
 user.setPassword("password");
 //此时的user为一个Transient对象,因为没有与任何数据库的任何记录相关联.

 Session session = sessionFactory.openSession();
 Transaction tx=session.beginTransaction();
 //此时的user仍为一个Transient对象

session.save( user );
 //此时的user为Persistent
 tx.commit();
 //提交后向数据库中加入一条记录.
 Transaction tx2=session.beginTransaction();
 user.setPassword("abc");
 tx2.commit();
//虽然在这个事务中没有调用Session的save()方法来保存user对象
//但由于user对象处于persistent状态,所以对user所做的任何修改都将被持久
//化到数据库,所以这时数据库中的密码已经变为:abc;
 session.close();

    特征:

  • 每个persistent状态的实体对象都与一个session对象的实例相关联
  • 处于Persistent状态的实体对象是与数据库中的记录相关联的.
  • Hibernate会依据persistent状态的实体对象的属性变化而改变数据库中相对应的记录.

   

    3.Detached(游离态也叫脱管态):对于Persistent对象,当不再与它所对应的Session对象相关联时,这个对象就是游离态.

 //创建一个Transient对象
 User user=new User();http://writeblog.csdn.net/PostEditPlain.aspx
个人空间—后台
 user.setName("username");
 user.setPassword("password");
 //此时的user为一个Transient对象,因为没有与任何数据库的任何记录相关联.

 Session session = sessionFactory.openSession();
 Transaction tx=session.beginTransaction();
 //此时的user仍为一个Transient对象

 session.save( user );
 //此时的user为Persistent
 tx.commit();
 //提交后向数据库中加入一条记录.

  session.close();
 //此时user为Detached 状态,此时对user所进行的任何修改,
 //将不会对数据库有任何影响.

特征:

  • 游离态是由持久态实体对象转变而来的.
  • 游离态实体不再与session对象相关联.
  • 游离态实体对象与数据库中的记录没有直接联系,对其所做的任何修改将不会影响到到数据库中的数据.
  • 游离态实体对象在数据库有相对应的数据记录,如果没有被其他事务删除.

原文链接:

http://blog.csdn.net/hgd250/article/details/2775943

 

时间: 2024-09-19 09:23:26

Hibernate实体对象的生命周期(三种状态详解)的相关文章

Android 三种动画详解及简单实例

Android 三种动画详解 帧动画 一张张图片不断的切换,形成动画效果 在drawable目录下定义xml文件,子节点为animation-list,在这里定义要显示的图片和每张图片的显示时长 <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="

Service Activity的三种交互方式(详解)_Android

service有两种类型: 本地服务(Local Service):用于应用程序内部 远程服务(Remote Sercie):用于android系统内部的应用程序之间 前者用于实现应用程序自己的一些耗时任务,比如查询升级信息,并不占用应用程序比如Activity所属线程,而是单开线程后台执行,这样用户体验比较好. 后者可被其他应用程序复用,比如天气预报服务,其他应用程序不需要再写这样的服务,调用已有的即可. 编写不需和Activity交互的本地服务示例 本地服务编写比较简单.首先,要创建一个Se

Service Activity的三种交互方式(详解)

service有两种类型: 本地服务(Local Service):用于应用程序内部 远程服务(Remote Sercie):用于android系统内部的应用程序之间 前者用于实现应用程序自己的一些耗时任务,比如查询升级信息,并不占用应用程序比如Activity所属线程,而是单开线程后台执行,这样用户体验比较好. 后者可被其他应用程序复用,比如天气预报服务,其他应用程序不需要再写这样的服务,调用已有的即可. 编写不需和Activity交互的本地服务示例 本地服务编写比较简单.首先,要创建一个Se

ajax readyState的五种状态详解

在<Pragmatic Ajax A Web 2.0 Primer >中对readyStae状态的介绍,摘译如下: 0: (Uninitialized) the send( ) method has not yet been invoked. 1: (Loading) the send( ) method has been invoked, request in progress. 2: (Loaded) the send( ) method has completed, entire res

Delphi2010中DataSnap高级技术(7)—TDSServerClass中Lifecycle生命周期三种属性说明

Lifecycle 三种属性: Session.Invocation.Server 这三种属性都用在什么情况,有什么要注意的事项,Delphi2010中罕有说明. 如果乱用这三种属性,你的服务程序有可能崩溃,数据混乱,内存占用大,效率低等问题! 下面我对这三种属性的使用环境逐一介绍: 1. Session 说明:这是delphi2010中默认属性,也是delphi推荐设置.Session会为每个来自客户端的链接,建立一个线程来实例化.实例化是什么概念呢?就是这个线程把所有你将要用到的类.函数等等

Android中Activity生命周期和启动模式详解_Android

Activity生命周期经典图解: 按键对生命周期的影响: BACK键: 当我们按BACK键时,我们这个应用程序将结束,这时候我们将先后调用onPause()->onStop()->onDestory()三个方法. 再次启动App时,会执行onCreate()->onStart()->onResume() HOME键: 当我们打开应用程序时,比如浏览器,我正在浏览NBA新闻,看到一半时,我突然想听歌,这时候我们会选择按HOME键,然后去打开音乐应用程序,而当我们按HOME的时候,A

Android中Activity生命周期和启动模式详解

Activity生命周期经典图解: 按键对生命周期的影响: BACK键: 当我们按BACK键时,我们这个应用程序将结束,这时候我们将先后调用onPause()->onStop()->onDestory()三个方法. 再次启动App时,会执行onCreate()->onStart()->onResume() HOME键: 当我们打开应用程序时,比如浏览器,我正在浏览NBA新闻,看到一半时,我突然想听歌,这时候我们会选择按HOME键,然后去打开音乐应用程序,而当我们按HOME的时候,A

Javascript定义类(class)的三种方法详解_javascript技巧

将近20年前,Javascript诞生的时候,只是一种简单的网页脚本语言.如果你忘了填写用户名,它就跳出一个警告. 如今,它变得几乎无所不能,从前端到后端,有着各种匪夷所思的用途.程序员用它完成越来越庞大的项目. Javascript代码的复杂度也直线上升.单个网页包含10000行Javascript代码,早就司空见惯.2010年,一个工程师透露,Gmail的代码长度是443000行! 编写和维护如此复杂的代码,必须使用模块化策略.目前,业界的主流做法是采用"面向对象编程".因此,Ja

Android编程实现XML解析与保存的三种方法详解

本文实例讲述了Android编程实现XML解析与保存的三种方法.分享给大家供大家参考,具体如下: 简介 在Android开发中,关于XML解析有三种方式,分别是: 1. SAX 基于事件的解析器,解析速度快,占用内存少.非常适合在Android移动设备中使用. 2. DOM 在内存中以树形结构存放,因此检索和更新效率会更高.但是对于特别大的文档,解析和加载整个文档将会很耗资源 3. PULL 基于事件的解析器,不同于SAX是,PULL是主动请求下一个事件,所以在可控上PULL要比SAX实用.An