hibernate实体对象的生命周期

8.2 实体对象的生命周期

8.2.1 实体对象的3种状态

(1)自由状态Transient

自由状态转持久状态session.save

结论:处于自由状态的实体对象,可以通过Session.save方法转换成持久状态。

如果一个实体对象是由hibernate加载(如通过Session.load方法获得),那么,它也处于持久状态。

(2)持久状态Persistent

持久状态的对象对应了数据库中的一条记录,可以看作是数据库记录的对象化操作接口,其状态的变更将对数据库中的记录产生影响。

(3)游离状态Detached

持久状态转游离状态:session.close

处于持久状态的对象,其对应的Session实例关闭之后,那么,此对象就处于游离状态。

自由状态与游离状态的区别

自由状态中的实体对象,无主键信息,而游离状态的实体对象,包含了其对应的数据库记录的主键值。

自由状态的对象与库表中的记录无关,我们无法根据自由状态对象中的信息在库表中找寻到对应的记录,而游离状态的对象,虽然与Session实例脱离,但我们根据其中的信息,能够寻找到库表中对应的数据记录。

持久状态转自由状态:session.delete

实体对象从持久状态转变为自由状态,一般由session.delete方法完成。

 

       //实体对象的三种状态

       public static void main(String[] args) {

              Session session=HibernateSessionFactory.getSession();

              Dept d=new Dept();

              d.setDeptno((byte)14);

              d.setDname("劳动部");

              d.setLoc("山东青岛");//此时d处于自由状态

              Transaction tran=session.beginTransaction();

              session.save(d);

              tran.commit();//此时d处于持久状态

              session.close();//此时的d处于游离状态

              Session session2=HibernateSessionFactory.getSession();

              Transaction tran2=session2.beginTransaction();

              session2.update(d);//对象d由游离状态转为持久状态

              d.setDeptno((byte)14);

              d.setDname("技术部");

              d.setLoc("山东临沂");//由于d对象处于持久状态,因此属性变更将自动由Hibernate固化到数据库

              tran2.commit();     

       }

}

执行结果:

Hibernate: insert into SCOTT.DEPT (DNAME, LOC,DEPTNO) values (?, ?, ?)

Hibernate: update SCOTT.DEPT set DNAME=?, LOC=?where DEPTNO=?

       public staticvoid main(String[] args) {

              Sessionsession=HibernateSessionFactory.getSession();

              Deptd=new Dept();//自由状态

              d.setDeptno((byte)15);

              d.setDname("文化部");

              d.setLoc("河北邯郸");

              Transactiontran=session.beginTransaction();

              session.save(d);//持久状态

              tran.commit();

              session.flush();

              Transactiontran2=session.beginTransaction();

              session.delete(d);

              tran2.commit();//由持久状态转化成自由状态

              System.out.println(d.getDeptno());

       }

       执行结果:

Hibernate: insert into SCOTT.DEPT (DNAME, LOC,DEPTNO) values (?, ?, ?)

Hibernate: delete from SCOTT.DEPT where DEPTNO=?

15

(1)   VO与PO的主要区别

从“实体对象是否被纳入Hibernate实体管理容器”的立场区分:

观点:将处于自由状态和游离状态的对象统称为值对象(VO即Value Object),而将处于持久状态的对象称为持久对象(PO即Persistence Object)

VO与PO的主要区别

VO是相对独立的实体对象,处于非管理状态

PO是由Hibernate纳入其“实体管理容器”的对象,它代表了与数据库中某条记录对应的Hibernate实体,PO的变化在事务提交时将反映到实际数据库中。

如果一个PO与其对应的Session实例分离,那么此时,它又会变成一个VO.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值