004---持久对象的生命周期介绍

持久化对象的状态:

1、   瞬时对象(Transient Object)使用new操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其它对象所引用),它们的状态将会丢失,并由垃圾回收机制回收

2、   持久化对象(Persistent Object)持久实例是任何具有数据库标识的实例,它有持久化管理器Session统一管理,持久实例是在事务中进行操作的----它们的状态在事务结束时同数据库进行同步。当事务提交时,通过执行SQL的INSERT、UPDATE和DELETE语句把内存中的状态同步到数据库中。

离线对象(Detached Object):Session关闭之后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,它们不再受hibernate管理

Transient对象:随时可能被垃圾回收器回收(在数据库中没有于之对应的记录,应为是new初始化),而执行save()方法后,就变为Persistent对象(持久性对象),没有纳入session的管理

Persistent对象:在数据库有存在的对应的记录,纳入session管理。在清理缓存(脏数据检查)的时候,会和数据库同步。

Detached对象:也可能被垃圾回收器回收掉(数据库中存在对应的记录,只是没有任何对象引用它是指session引用),注引状态经过Persistent状态,没有纳入session的管理

赃数据检查(版本比较)

try {

session = HibernateUtils.getSession();

tx = session.beginTransaction();

//Transient状态

user = new User();

user.setName("李四");

user.setPassword("123");

user.setCreateTime(new Date());

user.setExpireTime(new Date());

/*

* persistent状态

* persistent状态的对象,当属性发生改变的时候,hibernate会自动和数据库同步

*/

session.save(user);

user.setName("王五");

tx.commit();

} catch (Exception e) {

e.printStackTrace();

tx.rollback();

} finally {

HibernateUtils.closeSession(session);

}

session现在插入一条数据:User 对象name: 李四,现在需要修改数据,修改数据时采用数据版本的比较,修改之前对现有数据记录照一个快照(这个快照为最新数据“name:李四”),现在要User对象的name更改为五王(name:五王),当session提交事务之前时commit(),需要清理缓存(也称为賍数据对比),查看哪些数据需要发innert的SQL语句,而哪些需要发update语句。此处发出两条(第一条:为innert语句添加;第二条:在賍数据对比时发现数据发生改变,就发出update语句)

Hibernate: insert into User (name, password, createTime, expireTime, id) values (?, ?, ?, ?, ?)

Hibernate: update User set name=?, password=?, createTime=?, expireTime=? where id=?

完整代码如下:

public void testSave1(){
        Session session = null;
        Transaction tx = null;
        User user = null;
        
        try {
            session = HibernateUtils.getSession();
            tx = session.beginTransaction();
            
            //Transient状态
            user = new User();
            user.setName("李四");
            user.setPassword("123");
            user.setCreateTime(new Date());
            user.setExpireTime(new Date());
            
            /*
             * persistent状态
             * persistent状态的对象,当属性发生改变的时候,hibernate会自动和数据库同步
             */
            session.save(user);
            
            user.setName("王五");
            //实际上user.setName("王五")此时已经发出一条update指令了。
            //也可以显示的调用update指定
            //session.update(user);
            
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        } finally {
            HibernateUtils.closeSession(session);
        }
        
        /*
         * 从此处开始session已经在上面关闭,这时user对象状态就变为detached状态,
         * 所有user对象已经不被session管理,但数据库中确实存在与至对应的记录(王五)。
         */
        //detached状态
        user.setName("张三");
        
        try {
            session = HibernateUtils.getSession();
            session.beginTransaction();
            /*
             * 此时session又对user对象进行管理
             * 当session发出update指定后,进行更新数据为(张三。)
             */
            session.update(user);

//update后user对象状态又变为persistent状态
            session.getTransaction().commit();
            /*
             * 此时session提交事务,发出update语句
             * Hibernate: update User set name=?, password=?, createTime=?, expireTime=? where id=?
             */
        } catch (HibernateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }
    }

Hibernate加载数据:

      两种:get()、load()

一、 Session.get(Class arg0, Serializable arg1)方法

* arg0:需要加载对象的类,例如:User.class

* arg1:查询条件(实现了序列化接口的对象):

例"4028818a245fdd0301245fdd06380001"字符串已经实现了序列化接口。

返回值: 此方法返回类型为Object,也就是对象,然后我们再强行转换为需要加载的对象就可以了。

如果数据不存在,则返回null;

注:执行此方法时立即发出查询SQL语句。加载User对象

 

加载数据库中存在的数据,代码如下:

try {
            session = sf.openSession();
            session.beginTransaction();
            
            /*
             * Object org.hibernate.Session.get(Class arg0, Serializable arg1) throws HibernateException
             * arg0:需要加载对象的类,例如:User.class
             * arg1:查询条件(实现了序列化接口的对象):例"4028818a245fdd0301245fdd06380001"字符串已经实现了序列化接口。
             * 此方法返回类型为Object,也就是对象,然后我们再强行转换为需要加载的对象就可以了。
                如果数据不存在,则返回null
             * 执行此方法时立即发出查询SQL语句。加载User对象。
             */
            User user = (User)session.get(User.class, "4028818a245fdd0301245fdd06380001");
            
            //数据加载完后的状态为persistent状态。数据将与数据库同步。
            System.out.println("user.name=" + user.getName());
            
            //因为此的user为persistent状态,所以数据库进行同步为龙哥。
            user.setName("龙哥");
            
            session.getTransaction().commit();
        } catch (HibernateException e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        } finally{
            if (session != null){
                if (session.isOpen()){
                    session.close();
                }
            }

二、 Object Session.load(Class arg0, Serializable arg1) throws HibernateException

* arg0:需要加载对象的类,例如:User.class

* arg1:查询条件(实现了序列化接口的对象):例"4028818a245fdd0301245fdd06380001"字符串已经实现了序列化接口。

* 此方法返回类型为Object,但返回的是代理对象。

* 执行此方法时不会立即发出查询SQL语句。只有在使用对象时,它才发出查询SQL语句,加载对象。

* 因为load方法实现了lazy(称为延迟加载、赖加载)

* 延迟加载:只有真正使用这个对象的时候,才加载(才发出SQL语句)

* hibernate延迟加载实现原理是代理方式。

* 采用load()方法加载数据,如果数据库中没有相应的记录,则会抛出异常对象不找到(org.hibernate.ObjectNotFoundException)

try {

session = sf.openSession();

session.beginTransaction();

User user = (User)session.load(User.class, "4028818a245fdd0301245fdd06380001");

//只有在使用对象时,它才发出查询SQL语句,加载对象。

System.out.println("user.name=" + user.getName());

//因为此的user为persistent状态,所以数据库进行同步为龙哥。

user.setName("发哥");

session.getTransaction().commit();

} catch (HibernateException e) {

e.printStackTrace();

session.getTransaction().rollback();

} finally{

if (session != null){

if (session.isOpen()){

session.close();

}

}

}

Hibernate两种加载数据方式的区别:

get()方法默认不支持lazy(延迟加载)功能,而load支持延迟加载

get()方法在查询不到数据时,返回null,而load因为支持延迟加载,只有在使用对象时才加载,所以如果数据库中不在数据load会抛出异常(org.hibernate.ObjectNotFoundException)。

get()和load()只根据主键查询,不能根据其它字段查询,如果想根据非主键查询,可以使用HQL

hibernate更新数据:

建立使用hibernate进行更新数据时,先加载数据,然后再修改后更新。

否则一些字段可以会被null替换。

try {

session = sf.openSession();

session.beginTransaction();

User user = new User();

user.setId("4028818a245fdd0301245fdd06380001");

user.setName("wjt276");

//Transient状态

/*

* 目前这样更新,数据库记录中此条记录,除了id、name字段为设置字段,其它均为null,因为对象其它

* 属性没有设置数据,因为更新数据时要先加载需要更新数据的对象,再修改更新。

*/

session.update(user);//user为persistent状态

session.getTransaction().commit();

} catch (HibernateException e) {

// TODO Auto-generated catch block

e.printStackTrace();

session.getTransaction().rollback();

} finally{

if (session != null){

if (session.isOpen()){

session.close();

}

}

}

Hibernate删除数据对象:

删除对象,一般先加载上来对象,然后再删除该对象。

对象删除后,对象状态为Transistent状态。

代码如下:

/**

* hibernate删除对象

*/

public void testDelete1(){

Session session = null;

try {

session = HibernateUtils.getSession();

session.beginTransaction();

User user = (User)session.load(User.class, "4028818a245fdd0301245fdd06380001");

session.delete(user);

session.getTransaction().commit();

} catch (HibernateException e) {

e.printStackTrace();

session.getTransaction().rollback();

} finally{

if (session != null){

if (session.isOpen()){

session.close();

}

}

}

//transistent状态(数据库中没有配区的数据记录。)

}

时间: 2024-08-03 11:14:19

004---持久对象的生命周期介绍的相关文章

hibernate--持久对象的生命周期介绍

持久化对象的状态 : 1. 瞬时对象(Transient Object):使用new操作符初始化的对象不是立刻就持久的.它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其它对象所引用),它们的状态将会丢失,并由垃圾回收机制回收 2. 持久化对象(Persistent Object):持久实例是任何具有数据库标识的实例,它有持久化管理器Session统一管理,持久实例是在事务中进行操作的----它们的状态在事务结束时同数据库进行同步.当事务提交时

hibernate在持久对象的生命周期(三州:自由状态,持久状态,自由状态 之间的转换)

三种状态的基本概念: 1.  临时身份(Transient):也被称为自由状态,它只存在于内存中,并且在数据库中没有相应的数据. 使用new创建的对象,久化,没有处于Session中,处于此状态的对象叫暂时对象: 2,  持久化状态(Persistent):与session关联而且在数据库中有对应数据. 已经持久化.增加到了Session缓存中.如通过hibernate语句保存的对象.处于此状态的对象叫持久对象: 3,  游离状态(Detached):持久化对象脱离了Session的对象.如Se

hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)

三态的基本概念: 1,  暂时状态(Transient):也叫自由态,仅仅存在于内存中,而在数据库中没有对应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫暂时对象: 2,  持久化状态(Persistent):与session关联而且在数据库中有对应数据.已经持久化,添?到了Session缓存中.如通过hibernate语句保存的对象.处于此状态的对象叫持久对象: 3,  游离状态(Detached):持久化对象脱离了Session的对象.如Session缓

Android四大基本组件介绍与生命周期介绍。

Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一:了解四大基本组件 Activity : 应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应. Activity之间通过Intent进行通信.在Intent 的描述结构中,有两个最重要的部分:动作和动作对应的数据. 典型的动作类型有:M AIN(activity的门户).V

MVC3+EF4.1学习系列(二)-------基础的增删改查和持久对象的生命周期变化

上篇文章中 我们已经创建了EF4.1基于code first的例子  有了数据库 并初始化了一些数据  今天这里写基础的增删改查和持久对象的生命周期变化 学习下原文先把运行好的原图贴来上~~ 一.创建详细页 首先 我们先在控制器下 添加详细页的方法 因为这篇文章后面要介绍持久对象声明周期的变化 所以在这里先看下有哪些状态 EF里一共有这五中生命状态类型 其实 看名字我们可以大概猜测出个一二三来~~  游离的 未改变的  新添加的  已删除的 修改的  但是是怎么变化的能 我们在后面的代码中实践与

hibernate 持久化对象的生命周期

包括三种状态:瞬态(自由态),持久态,托管态(游离态) 自由态 持久化对象的自由态,指的是对象在内存中存在,但是在数据库中并没有数据与其关联. 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象的变化将会被同步到数据库中. 游离态 处于持久态的对象,在其对应的Session实例关闭后,此时对象进入游离态.也就是说Session实例是持久态对象的宿主环境,一旦宿主环境失效,那么持久态对象迚入游离状态. session.beginTransaction(); Us

Java虚拟机(三)垃圾标记算法与Java对象的生命周期

相关文章 Java虚拟机系列 前言 这一节我们来简单的介绍垃圾收集器,并学习垃圾标记的算法:引用计数算法和根搜索算法,为了更好的理解根搜索算法,会在文章的最后介绍Java对象在虚拟机中的生命周期. 1.垃圾收集器概述 垃圾收集器(Garbage Collection),通常被称作GC.提到GC,很多人认为它是伴随Java而出现的,其实GC出现的时间要比Java早太多了,它是1960诞生于MIT的Lisp. GC主要做了两个工作,一个是内存的划分和分配,一个是对垃圾进行回收.关于内存的划分和分配,

hibernate 持久化对象的生命周期 2.1

持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象的变化将会被同步到数据库中 session.save() .....到..session.getTransaction().commit();这个过程 托管态(游离态 提交之后的状态 处于持久态的对象,在其对应的Session实例关闭后,此时对象进入游离态.也就是说Session实例是持久态对象的

六 领域驱动设计-领域对象的生命周期

目录 领域驱动设计-领域对象的生命周期 AGGREGATE FACTORY 领域驱动设计-领域对象的生命周期 每个对象都有生命周期,如图6-1所示.对象自创建后,可能会经历各种不同的状态,直至最终消亡--要么存档,要么删除.当然,很多对象是简单的临时对象,仅通过调用构造函数来创建,用来做一些计算,而后由垃圾收集器回收.这类对象没必要搞得那么复杂.但有些对象具有更长的生命周期,其中一部分时间不是在活动内存中度过的.它们与其他对象具有复杂的相互依赖性.它们会经历一些状态变化,在变化时要遵守一些固定规