`
newleague
  • 浏览: 1476006 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

三种状态

阅读更多

(madp:

如:

session.beginTransaction();

Person p = new Person();
p.setId(169);
session.delete(p);

是不能删除记录的,因为p处于临时状态

)

 

在Hibernate中,对象有三种状态:临时状态、持久状态和游离状态。
临时状态:当new一个实体对象后,这个对象处于临时状态,即这个对象只是一个保存临时数据的内存区域,如果没有变量引用这个对象,则会被jre垃圾回收机制回收。这个对象所保存的数据与数据库没有任何关系,除非通过Session的save或者SaveOrUpdate把临时对象与数据库关联,并把数据插入或者更新到数据库,这个对象才转换为持久对象。
例如:Emp e=new Emp();    //创建临时对象
          e.setEmpno((long) 8888);
          e.setEName("mike");
          ...
          EmpDAO d=new EmpDAO();
          d.save(e);      //持久化
          ...

持久状态:持久化对象的实例在数据库中有对应的记录,并拥有一个持久化表示(ID)。对持久化对象进行delete操作后,数据库中对应的记录将被删除,那么持久化对象与数据库记录不再存在对应关系,持久化对象变成临时状态。
    持久化对象被修改变更后,不会马上同步到数据库,知道数据库事务提交。在同步之前,持久化对象是脏的(Dirty)。
例如:
          Emp e=new Emp(); //创建了临时的对象
          EmpDAO edao= new empDAO();
          e=edao.findbyEmpno((long) 7786);    //使对象与数据库记录对应,从而持久化
          e.setEname("新的名字");                     //修改了持久化对象,使之处于 Dirty
          ......
          edao.saveorupdate(e);                      //保存,但是仍然 Dirty
          tran.commit();                                     //提交,实现与数据库同步,不再Dirty
          ......

游离状态:当Session进行了Close、Clear或者evict后,持久化对象虽然拥有持久化标识符和与数据库对应记录一致的值,但是因为会话已经消失,对象不在持久化管理之内,所以处于游离状态(也叫:脱管状态)。游离状态的对象与临时状态对象是十分相似的,只是它还含有持久化标识。


其中,持久化状态的对象,简称为:PO
而临时状态和游离状态的对象,简称为: VO

 

(madp:

 

    本文介绍Hibernate的三个状态,此为第一部分。Java应用程序与Hibernate之间的主要运行时接口。它是抽象了持久化服务概念的核心抽象API类。

     

    Java应用程序与Hibernate之间的主要运行时接口。它是抽象了持久化服务概念的核心抽象API类。
    Session的生命周期绑定在一个物理的事务(tansaction)上面。(长的事务可能跨越多个数据库事物。)

    Session的主要功能是提供对映射的实体类实例的创建,读取和删除操作。
    实例可能以下面三种状态存在:
    ◆自由状态(transient): 不曾进行持久化,未与任何Session相关联
    ◆持久化状态(persistent): 仅与一个Session相关联
    ◆游离状态(detached): 已经进行过持久化,但当前未与任何Session相关联

    游离状态的实例可以通过调用update(),lock(),replicate(),save(),persist()或者saveOrUpdate()方法进行持久化。持久化实例可以通过调用 delete()变成游离状态。通过get()或load()方法得到的实例都是持久化状态的。游离或者自由状态下的实例可以通过调用merge()方法成为一个新的持久化实例。
    save()和persist()将会引发SQL的INSERT,delete()会引发SQLDELETE,而update()或merge()会引发SQLUPDATE。对持久化(persistent)实例的修改在刷新提交的时候会被检测到,它也会引起SQLUPDATE。saveOrUpdate()或者replicate()会引发SQLINSERT或者UPDATE。

    其具体实现并不一定是线程安全的。每个线程/事务应该从一个SessionFactory获取自己的session实例。

    如果其持久化对象类是可序列化的,则Session实例也是可序列化的。

    一个典型的事务应该使用下面的形式:Session sess = factory.openSession();

  1. Transaction tx;  
  2. try {  
  3. tx = sess.beginTransaction();  
  4. //do some work  
  5. ...  
  6. tx.commit();  
  7. }  
  8. catch (Exception e) {  
  9. if (tx!=null) tx.rollback();  
  10. throw e;  
  11. }  
  12. finally {  
  13. sess.close();  
  14. 如果Session抛出了异常, 事务必须回滚而session会被废弃。在异常发生后Session的内部状态可能会与数据库失去同步

)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics