Hibernate持久化对象的状态与生命周期

持久化对象的生命周期数据库

对象在Hiberurnate中的状态有三种session

 

自由态spa

Object若是不和Session发生关系,则Object处于自由态。对象

new建立一个Object时,为自由态;生命周期

当持久态Object进行session.delete(Object)时,Object会回到自由态;get

 

持久态同步

ObjectSession发生关系,则Object处于持久态。io

持久态的Object内容发生变化时,会同步到数据库中的相应数据行;date

 

调用session.get(key)session.load(key)得到一个Object的时候为持久态;select

注意.get(key).load(key)的区别

session.get(key)会当即执行select语句,并返回对应key的数据库Object

session.load(key)不会马上执行select语句,会在使用这个Object时执行select

         若是调用一个没有查询出结果的session.get(key)返回对象,会得到NullPorenterExeption

         若是调用一个没有查询出结果的session.load(key)返回对象,会得到ObjectNotFoundException

 

调用session.save(Object)session.persist(Object)对一个自由态Object使用时,数据会被存进数据库保存入数据库当中,Object会进入持久态,二者的区别在于session.save(Object)会返回持久态Objectkey

 

游离态

调用session.clear()会把Session中的全部持久态Object进入游离态;

调用session.flush()会把SessionObject的更新同步到数据库的相应数据行

 

注意session.sava(Object)session.update(Object)的区别

session.sava(Object)对一个自由态Object进行保存到数据库中,而且让Object进入持久态;

session.update(Object)对一个游离态Object进行保存到数据库中,并将让Obbject进入持久态;

 

调用session.saveOrUpdate(Object)时,方法会自动判断Object处于什么状态,并使用相应的操做将Object保存到数据库中;

若是Object处于自由态,调用session.update(Object)时,不会有任何做用;

 

特殊方法

调用session. getTransaction().merge(Object)时,若是持久化Object在数据库中存在,会进行同步操做。若是Object在数据库不存在,会进行保存操做;

调用session. getTransaction().merge(Object)时,若是Object是游离态的,会进行同步操做,操做后对象会从新回到游离态。

当同一个Session中存在两个Objectkey相同时,调用session.saveOrUpdate(Object)方法的话会有错误抛出,调用session. getTransaction().merge(Object)方法的话会执行同步操做;