持久化对象的生命周期数据库
对象在Hiberurnate中的状态有三种session
自由态spa
Object若是不和Session发生关系,则Object处于自由态。对象
new建立一个Object时,为自由态;生命周期
当持久态Object进行session.delete(Object)时,Object会回到自由态;get
持久态同步
Object和Session发生关系,则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)会返回持久态Object的key;
游离态
调用session.clear()会把Session中的全部持久态Object进入游离态;
调用session.flush()会把Session中Object的更新同步到数据库的相应数据行
注意: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中存在两个Object的key相同时,调用session.saveOrUpdate(Object)方法的话会有错误抛出,调用session. getTransaction().merge(Object)方法的话会执行同步操做;