zoukankan      html  css  js  c++  java
  • Java对象在Hibernate持久化层的状态

    -临时状态:刚用new语句创建对象,还没有被持久化,并且不处于Session缓存中。处于临时状态的java对象被称为临时对象。

    -持久化状态:已经被持久化,并且加入到Session的缓存中。处于持久化状态的java对象被成为持久化对象。

    -游离状态:已经被持久化,但不再处于Session的缓存中。处于游离状态的java对象被成为游离对象。

         //对象状态转换的过程
            Transaction ts=session.beginTransaction();
            User user =new User();                  //临时状态
             user.setName("tom");
             user.setPassword("123456");
    
            session.save(user);                     //转变为持久化状态
            ts.commit();                            //持久化状态 
    
            session.close();                        //转变为游离状态
            sessionfactory.close();
            System.out.println(user.getName());     //游离状态 
    临时对象的特征:
            -OID为null
            -不处于Session的缓存中,也可以说,不被任何一个Session实例关联
            -在数据库中没有对应的记录
    
    持久化对象的特征:
            -OID不为null
            -位于一个Session实例的缓存中,持久化对象总是被一个Session实例关联
            -持久化对象和数据库中的相关记录对应
            -会根据持久化对象的属性变化,同步更新数据库。
                User  user=(User)session.get(User.class,1);//获取持久化对象 持久状态
                user.setName("jerry");
                transaction.commit();
            我们发现我们没有执行update语句,却打印了update语句。Hibernate会自动将持久化对象的状态同步到数据库中。
    
    
    游离对象的特征:
            -OID不为null
            -不再位于Session的缓存中,也可以说,游离对象不被Session关联
            -数据库中有对应的记录 

    三种状态的转换

        1)临时状态转换持久化状态
            -Session的save()方法会将临时状态转换成持久状态。
                把要保存的对象放入Session缓存中,使它进入持久化状态。使用映射文件指定的主键生成策略,为持久化对象分配唯一OID。
                save方法只是为对象分配UID。我们可以在save方法处打断点。
                当我们的主键生成策略为native时,由于我们使用mysql数据库,主键自增,所以执行完save方法后,打印insert语句,mysql数据库为我们对象自增OID 
                当我们的主键生成策略为incrementt时,increment是由Hibernate维护,先去表中查最大ID然后+1,我们执行完save方法之后,发现打印select查找最大id的语句,
           执行commit时才打印插入语句 2)临时状态转换成游离状态 -将临时状态的对象OID设置为数据库中对应的记录. User user=new User(); user.setId(1); 3)持久化状态转换成临时状态 第一种: User user=(User)session.get(User.class,1);//获取持久化对象 持久状态 session.close(); //游离状态 user.setId(null);//临时状态 第二种: User user=(User)session.get(User.class,1);//获取持久化对象 持久状态 session.evict(user); //游离状态,此方法会将session缓存中清除持久化对象,使其变为游离状态 user.setId(null);//临时状态 4)持久化状态转换成游离状态 第一:调用session的close方法,持久化状态变为游离状态 第二: 调用session的evict()方法方法,将持久状态转变为游离状态 5)游离状态转换成临时状态 只需要将游离状态的对象OID变为null。 6)游离状态转换成持久状态 Session的update()方法使游离状态转换成持久状态。 User user=(User)session.get(User.class,1);//获取持久化对象 持久状态 session.evict(user); //游离状态,此方法会将session缓存中清除持久化对象,使其变为游离状态 session.update(user);

     

  • 相关阅读:
    AS3 setChildIndex的bug
    android mediaplayer Should have subtitle controller already set
    添加糢糊视图
    Android Studio Gradle project sync failed
    VS2012 生成可以在XP下运行的exe文件
    JavaScript this的理解
    Adobe AIR 应用程序图标详细描述
    Ubuntu16.04下安装httpd+svn+viewVC
    win10将mongodb加入系统服务,官方源码报错问题记录
    汇图网爬虫
  • 原文地址:https://www.cnblogs.com/qinjf/p/9060996.html
Copyright © 2011-2022 走看看