实体对象的生命周期在Hibernate应用中是一个很关键的概念正确的理解实体对象的生命周期将对我们应用Hibernate做持久层设计起到很大的作用而所谓的实体对象的生命周期就是指实体对象由产生到被GC回收的一段过程在这过程中我们需要理解的就是实体对象生命周期中的三种状态
自由状态(Transient)
所谓的Transient状态即实体对象在内存中自由存在与数据库中的记录无关通常是我们的JEE中VO并没有被纳入Hibernate的实体管理容器
Test test = new Test();
testsetName(energykk);
//此时的test对象处于Transient(自由状态)并没有被Hibernate框架所管理
持久状态(Persistent)
何谓 Persistent? 即实体对象已经处于被Hibernate实体管理容器容器所管理的状态这种状态下这个实体对象的引用将被纳入Hibernate实体管理容器容器所管理
处于Persistent状态的实体对象对它的变更也将被固化到数据库中
在JEE中通常指的是一个PO
Transaction tr = sessionbeginTransaction();
sessionsave(test);
//此时的test对象已经处于Persistent(持久状态)它被Hibernate纳入实体管理容器
mit();
Transaction tr = sessionbeginTransaction();
testsetName(xukai);
//在这个事务中我们并没有显示的调用save()方法但是由于Persistent状态的对象将会自动的固化到
//数据库中因此此时正处在Persistent状态的test对象的变化也将自动被同步到数据库中
mit();
处于Persistent状态的实体可以简单的理解为:如果一个实体对象与session发生了关联并且处于session的有效期内那么这个实体对象就处于Persistent状态
游离状态(Detached)
处于Persistent状态的实体对象其对应的session关闭以后那么这个实体就处于Detached状态
我们可以认为session对象就是一个Persistent的宿主一旦这个宿主失效那么这个实体就处于Detached状态
sessionclose();
//与test对象关联的session被关闭因此此时的test对象进入Detached(游离状态)
session = HibernateSessionFactorygetSession();
Transaction tr = sessionbeginTransaction();
sessionupdate(test);
//此时正处于Detached状态的test对象由于再次借助与session被纳入到Hibernate的实体管理容器所以此时的
//test对象恢复到Persistent状态
testsetName(jjjj);
mit();
sessionclose();
既然Transient状态的实体与Detached状态的实体都与Hibernate的实体管理容器没有关系那他们到底存在哪些差异?
差异就在于处于Transient状态的只有一个Name的属性此时的test对象所包含的数据信息仅限于此他与数据库中的记录没有任何瓜葛
但是处于Detached状态的实体已经不止包含Name这个属性还被赋予了主键也就是通常POJO里的id属性由于id是主键他可以确定数据库表中的一条
唯一的记录那么自然的处于Detached状态的实体就能与数据库表中拥有相同id的记录相关联
这就是他们之间所存在的差异简而言之Transient状态的实体缺乏与数据库表记录之间的联系而Detached状态的试题恰恰相反只不过是脱离了session这个数据库操作平台而已