zoukankan      html  css  js  c++  java
  • Hibernate三种状态

    Hibernate实体对象的状态:    瞬时态(Transient)、持久态(Persistent)、脱管态(Detached)

    A.瞬时态: (Value Object) / [VO]

      当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,如下:
                            
    Customer customer=new Customer(“zx”,27,images);
           这时customer对象就处于自由状态,为什么说customer对象处于自由状态呢?这是因为,此时customer只是通过JVM获得了一块内存空间,还并没有通过Session对象的save()方法保存进数据库,因此也就还没有纳入Hibernate的缓存管理中,也就是说customer对象现在还自由的游荡于Hibernate缓存管理之外。所以我们可以看出自由对象最大的特点就是,在数据库中不存在一条与它对应的记录。

    B.持久态: ( Persistence Object ) / [PO]

      持久化对象就是已经被保存进数据库的实体对象,并且这个实体对象现在还处于Hibernate的缓存管理之中。这是对该实体对象的任何修改,都会在清理缓存时同步到数据库中。如下所示:
        Customer customer=new Customer(“zx”,27,images);
        tx=session.beginTransaction();
        session.save(customer);
        customer=(Customer)session.load(Customer.class,”1”);
        customer.setAge(28);
        tx.commit();
      这时我们并没有显示调用session.update()方法来保存更新,但是对实体对象的修改还是会同步更新到数据库中,因为此时customer对象通过save方法保存进数据库后,已经是持久化对象了,然后通过load方法再次加载它,它仍然是持久化对象,所以它还处于Hibernate缓存的管理之中,这时当执行tx.commit()方法时,Hibernate会自动清理缓存,并且自动将持久化对象的属性变化同步到到数据库中。

    C.脱管态: (游离态)

      当一个持久化对象,脱离开Hibernate的缓存管理后,它就处于游离状态,游离对象和自由对象的最大区别在于,游离对象在数据库中可能还存在一条与它对应的记录,只是现在这个游离对象脱离了Hibernate的缓存管理,而自由对象不会在数据库中出现与它对应的数据记录。如下所示:
         Customer customer=new Customer(“zx”,27,images);
         tx=session.beginTransaction();
      session.save(customer);
      customer=(Customer)session.load(Customer.class,”1”);
      customer.setAge(28);
      tx.commit();
      session.close();

    当session关闭后,customer对象就不处于Hibernate的缓存管理之中了,但是此时在数据库中还存在一条与customer对象对应的数据记录,所以此时customer对象处于游离态。

    三种对象状态之间的转化:
       这三种对象状态,是可以相互转化的,一个自由对象可以通过session.save()方法或者session.saveorupdate()方法变成持久化对象,一个持久化对象可以通过session.flush()或者session.evict()方法,移出Hibernate缓存从而转化为游离对象,一个游离对象可以通过再次加载或者调用session.update()方法,再次恢复为持久化对象,也可以通过调用session.delete()方法变成自由对象,并且删除数据库中对应的数据记录。
      示例程序:

        Configuration cfg = new Configuration();
           SessionFactory sf=cfg.configure().buildSessionFactory();
        Customer customer=new Customer(“zx”,27,images); //customer对象处于自由状态
             Session session=sf.openSession();
        Transaction tx=session.beginTransaction();
          session.save(customer); //保存后customer对象处于持久化状态
        session.flush(); //清空缓存后customer对象处于游离状态
        tx.commit();
        session.close();
        Session session2=sf.openSession();
        Transaction tx2=session2.beginTransaction();
        session2.update(customer); //通过调用update()方法将游离状态的customer对象,再次转化成持久化状态
        session2.delete(customer); //调用delete()方法后,当清空缓存时,会将customer对象移出缓存,同时会在数据库中生成delete事务,来删除customer对象对应的数据记录
        tx.commit();
        session.close();

    未开放的博文是没有完善,敬请谅解!
  • 相关阅读:
    Maven 环境的配置
    zTree的简单例子
    plsql免安装客户端的配置
    HDU 1232 畅通工程
    HDU 5698 瞬间移动
    Codeforces 1015E1 Stars Drawing (Easy Edition)
    Codeforces 784B Santa Claus and Keyboard Check
    Codeforces 500C New Year Book Reading
    NSarray 赋值 拷贝 等问题记录
    UINavigationController 操作记录
  • 原文地址:https://www.cnblogs.com/bykj/p/4800533.html
Copyright © 2011-2022 走看看