三种状态

(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();

Transaction tx;   try  {   tx = sess.beginTransaction();   //do some work   ...   tx.commit();   }   catch  (Exception e) {   if  (tx!= null ) tx.rollback();   throw  e;   }   finally  {   sess.close();   } 

如果Session抛出了异常, 事务必须回滚而session会被废弃。在异常发生后Session的内部状态可能会与数据库失去同步

)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值