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

久化对象的状态:

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

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

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

 

 

 

 

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

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

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

 

 

Junit简介:

编写测试类xxxTest,需要继承TestCase

编写单元测试方法,测试方法必须以test开关,测试方法不能含有参数和返回值,如:

         Public void testHello1(){}

最好单元测试的代码单独建立一个目录。

 

------2009/10/17--------------

赃数据检查(版本比较)

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(),需要清理缓存(也称为賍数据对比),查看哪些数据需要发innertSQL语句,而哪些需要发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("张三");

       

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值