持久化对象的生命周期
对象在Hiberurnate中的状态有三种
自由态
Object如果不和Session发生关系,则Object处于自由态。
new创建一个Object时,为自由态;
当持久态Object进行session.delete(Object)时,Object会回到自由态;
持久态
Object和Session发生关系,则Object处于持久态。
持久态的Object内容发生变化时,会同步到数据库中的相应数据行;
调用session.get(key)和session.load(key)获得一个Object的时候为持久态;
注意:.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)方法的话会执行同步操作;