hibernate之对象的三种状态

       在学习Hibernate的过程,对象持久化时的三种状态以它们直接的转换是我们必须深入学习的,对它的深入理


解,才能更好的理解hibernate的运行机理。可以帮助我们更好的理解hibernate,JVM和sql的关系


下面我们通过两张图了解一下这三种状态:


一:三个对象的学习:

   

   下面这张图我主要整理了三种对象的定义和特点,作为简单的了解。


计算机生成了可选文字: 命令开辟内存空间的Java也就是平时所熟悉的普通JavaW-印象象由对对顺时勺匹一‘‘一特点卜诵不不11Session实例关联在数据库中没有和瞬时对象关联的记录,../与持久对象关联的session被关闭后,对象就变为脱管对象.对脱管对象的引川依然有效,对象可继续被修改.对象卜二…髯嚼诬甘持久的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier).本质卜和瞬时对象相同只是比爱瞬时对象多了一个数据库记录标识值id.和Session实例关联在数据库中有和持久对象关联的记录,...、….~~~....….….

 

 

注:Hibernate三种状态中游离对象和临时对象异同:


   1.两者都不会被Session关联,对象属性和数据库可能不一致;


   2.游离对象由持久化对象关闭Session而转化而来,在内存中还有对象所以此时就变成游离状态了;


二:三种状态转换的状态图:


计算机生成了可选文字: new语句临时状态saveorUp,,0南切Odel吐eo}deleteo持久化状态}eviCtocloseocle哟印南切OsaVeorUpdateOloc均游离状态垃圾回收图1对象的状态转换图

注:三种状态转化的方法都是通过session来调用。


       1.瞬态到持久态的方法有save()、saveOrUpdate()、get()、load();


       2.持久态到瞬态的方法有delete();


       3.游离态到持久态的方法有update()、saveOrUpdate()、lock();


       4.持久态到游离态的方法有:session.close()、session.evict()、session.clear()。

 

三:结合save(),update(),saveOrUpdate() 方法说明对象的状态

     

    1.Save() 方法将瞬时对象保存到数据库,对象的临时状态将变为持久化状态。当对象在持久化状态时,它一直


位于 Session 的缓存中,对它的任何操作在事务提交时都将同步到数据库,因此,对一个已经持久的对象调用 


save() 或 update() 方法是没有意义的。


    2.update() 方法两种用途重新关联脱管对象为持久化状态对象,显示调用 update() 以更新对象。调用 


update() 只为了关联一个脱管对象到持久状态,当对象已经是持久状态时,调用 update() 就没有多大意义了。


如:如果希望只有脱管对象改变了, Hibernate 才生成 update 语句,可以把映射文件中 <class> 标签的 select-


before-update 设为true, 这种会先发送一条 select 语句取得数据库中的值,判断值是否相同,如果相同就不执


行 update 语句。不过这种做法有一定的缺点,每次 update 语句之前总是要发送一条多余的 select 语句,影响性


能。对于偶尔更改的类,设置才是有效的,对于经常要更改的类这样做是影响效率的。


    3.saveOrUpdate() 方法兼具 save() 和 update() 方法的功能,对于传入的对象, saveOrUpdate() 首先判断


其是脱管对象还是临时对象,然后调用合适的方法。


代码示例:


public classSessionTest extends TestCase{
 
   public void testSave1(){
             Session session = null;
             Transaction tx=null;
             User user=null;
             try{
                       session=HibernateUtils.getSession();
                       tx = session.begionTransaction();
                      
                       // 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("李四");
                      
                       //可以显示的调用update方法,但是在持久状态没有什么意思
                       session.update(user);
                       tx.commit();
                    }catch(Exception e){
                            e.printStackTrace();
                            if (tx!=null){
                                       tx.rollback();
                                    }
                    }finally{
                               HibernateUtils.closeSession(session);
                            }
                            //session关闭之后为Detached状态
                            user.setName=("王五");
                            try{
                                    session=HibernateUtils.getSession();
                                    session.beginTranSaction();
                                    //将detached状态的对象重新纳入Session管理
                                    //此时将变为persistent状态的对象
                                    //persistent状态的对象,在清理缓存是会和数据库同步
                                    session.update(user);
                                    session.getTransaction().commit();//清除缓存
                                    }catch(Exceptione){
                                            e.printSatackTrace();
                                            session.getTransaction().rollback();
                                    }finally{
                                            HibernateUtils.closeSession(session);
                                    }
          }
          
          public void testGet1(){
             Session session = null;
                            try{
                                    session=HibernateUtils.getSession();
                                    session.beginTranSaction();
                                    //get加载上来的对象为持久对象
                                    //执行get会马上发出查询语句
                                    //get方法加载数据,如果不存在反回null
                        User user=(User)session.get(User.calss,"序列化的ID");
                                    System.out.println(user.getName());
                                    
                                    //persistent状态(持久状态)
                       //Persistent状态的对象,当对象的属性发送改变的时候
                       //hibernate在清理缓存(脏数据检查)的时候,会和数据库同步
                                    user.setName("赵柳");
                                    session.getTransaction().commit();//清除缓存
                                    }catch(Exceptione){
                                            e.printSatackTrace();
                                            session.getTransaction().rollback();
                                    }finally{
                                            HibernateUtils.closeSession(session);
                                    }
          }
          
                  public void testLoad1(){
             Session session = null;
                            try{
                                    session=HibernateUtils.getSession();
                                    session.beginTranSaction();
                                    //不会马上发出查询语句,因为load支持延迟加载
                                    //只有真正使用这个对象的时候,在创建,对于hibernate来说,才真正发出查询语句。
                                    //主要是为了提高性能。
                                    //hibernate是如何实现延迟加载的?采用代理对象实现,代理对象主要采用的是CGLIB库生成的
                                    //而不是JDK的动态代理,因为JDK的动态代理只能对实现了接口的类生成代理,CGLIB可以对类生成代理,他采用的是继承方式
                       //load查询,如果对象不存在,hibernate会抛出ObjectNotFoundException异常的。
                        User user=(User)session.Load(User.calss,"序列化的ID");
                                    System.out.println(user.getName());
                                    
                                    //persistent状态(持久状态)
                       //Persistent状态的对象,当对象的属性发送改变的时候
                       //hibernate在清理缓存(脏数据检查)的时候,会和数据库同步
                                    user.setName("王五");
                                    session.getTransaction().commit();//清除缓存
                                    }catch(Exceptione){
                                            e.printSatackTrace();
                                            session.getTransaction().rollback();
                                    }finally{
                                            HibernateUtils.closeSession(session);
                                    }
          }
          
          public voidtestDelete1(){
             Session session = null;
                            try{
                                    session=HibernateUtils.getSession();
                                    session.beginTranSaction();
                        User user=(User)session.Load(User.calss,"序列化的ID");
                        //删除,建议采用此种方法删除:先加载在删除
                              session.delete(user);
                                    session.getTransaction().commit();//清除缓存
                                    }catch(Exceptione){
                                            e.printSatackTrace();
                                            session.getTransaction().rollback();
                                    }finally{
                                            HibernateUtils.closeSession(session);
                                    }
          }
          public voidtestDelete2(){
             Session session = null;
                            try{
                                    session=HibernateUtils.getSession();
                                    session.beginTranSaction();
                  //手动构造Detached对象
                  User user=new User();
                  user.setID="序列化ID";
                              session.delete(user);
                                    session.getTransaction().commit();//清除缓存
                                    }catch(Exceptione){
                                            e.printSatackTrace();
                                            session.getTransaction().rollback();
                                    }finally{
                                            HibernateUtils.closeSession(session);
                                    }
          }
          
                  publicvoid testUpdate1(){
             Session session = null;
                            try{
                                    session=HibernateUtils.getSession();
                                    session.beginTranSaction();
                  //手动构造Detached对象
                  User user=new User();
                  user.setID="序列化ID";
                  user.setName("周六");
                              session.update(user);
                                    session.getTransaction().commit();//清除缓存
                                    }catch(Exceptione){
                                            e.printSatackTrace();
                                            session.getTransaction().rollback();
                                    }finally{
                                            HibernateUtils.closeSession(session);
                                    }
          }
          //建议用这种方式
                  publicvoid testUpdate2(){
             Session session = null;
                            try{
                                    session=HibernateUtils.getSession();
                                    session.beginTranSaction();
                 User user=(User)session.load(User.class,"序列化ID");
                  user.setName("周六");
                 //因为处于persistent状态,所以可以不用update,也可以显示的update
                              session.update(user);
                                    session.getTransaction().commit();//清除缓存
                                    }catch(Exceptione){
                                            e.printSatackTrace();
                                            session.getTransaction().rollback();
                                    }finally{
                                            HibernateUtils.closeSession(session);
                                    }
          }
}


 

总结:

      

    学习了解持久化的三个对象和三种状态直接的转换,是学习Hibenrnate的基础,对我们后面深入学习Hibenrnate


供帮助。我们会发现所有状态的转变都是以Session为轴,对Session的操作会引起状态的改变,这其中我们要重点区分


save(),update(),saveOrUpdate()三种方法的不同,以及load()和get()方法的区别(load支持延迟加载)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值