hibernate三种状态以及session方法

参考:

http://www.noobyard.com/article/p-xojjmzdo-mp.html

https://blog.csdn.net/tuke_tuke/article/details/49699757

三种状态的判断标准:
con1:是否获得了与数据库现存记录相对应的oid
con2:是否存在于Session缓存中

 

三种状态的定义:


if(!con1 && !con2){ transient 临时状态 } 

类似:没有编号的公司临时工

说明:临时状态表示在数据库中没有对应id的记录,同时在session缓存中也不存对应ID的对象

注意:临时对象可以存在id


if(con1 && con2){ persistent 持久化 } 

类似:是有编号的公司正式员工

说明:持久化对象表示在数据库中有对应id的记录,同时在session缓存中也存在对应ID的对象;


if(con1 && !con2) { detached 游离状态 } 

类似:休假中的公司正式员工(与公司失去联系)

说明:游离状态表示在数据库中有对应ID的记录,但在session缓存中不存在对应ID的对象;

注意:游离状态一定有ID

 

Session方法

Session的load()与get()方法:

hibernate中Session接口提供的get()和load()方法都是用来获取一个实体对象,在使用方式和查询性能上有一些区别:

1)当数据库中不存在与OID对应的记录时,load()方法抛出org.hibernate.ObjectNotFoundException异常,而get()方法返回为null
(2)load方法采用配置的加载策略(默认为延迟加载),而get()方法则会忽略配置,总是采用立即加载方法。

Session接口提供了4个重载的get方法,分别通过“持久类+主键”和“全类名+主键”以及“锁选项”来获取实体对象。
 

session的save()

注意:session的save()方法是用来持久化临时对象的。不应将持久化对象或游离对象传递给save()方法

若将持久化对象传递给save()方法,则该步保存操作是多余的。
若将游离对象传递给save()方法,则会重新生成ID,再保存一次。

Session的update()方法:

Session的update()方法使一个脱管对象转变为持久化对象。它完成以下操作:
(1)将游离对象加入到Session缓存中,使其转变为持久化对象。
(2)计划执行一个update语句。

Session的saveOrUpdate()方法:

Session的saveOrUpdate()方法同时包含了save()方法与update()方法的功能,如果传入的参数是临时对象,就调用save()方法;如果传入的参数是游离对象,就调用update()方法。

Session的delete()方法:

Session的delete()方法用于从数据库中删除一个java对象。delete()方法既可以删除持久化对象,也可以删除脱管对象。其处理过程如下: (1)如果传入的参数是脱管对象,则先使脱管对象与Session关联,使它变为持久化对象。如果参数是持久化对象,则忽略该步。 (2)计划执行一个delete语句。 (3)把对象从Session缓存中删除,该对象进入删除状态。