作者:李東龍
上篇博客對數據持久化狀態做了一些補充之後,下面來全面瞭解一下Session。看看Session都有那些作用和方法。
一、 緩存作用
a) 減少訪問數據庫的頻率。
b) 保證緩存中的對象與數據庫中的相關記錄保持同步。
Session有兩個方法:一個commit()事務提交方法,還有flush()刷新緩存方法,都有着清理緩存的作用。flush()進行緩存的清理,執行一系列的SQL語句,但不會提交事務。而commit()方法會先調用flush()方法,然後在提交事務。
二、 控制java對象持久化操作
1、Session的save()方法
session.save(customer);完成的操作:
(1) 把Customer對象加載到緩存中,使它變爲持久化對象。
(2) 選用映射文件指定的標識符生成器爲持久化對象分配唯一的OID。Customer.hbm.xml文件中<id>元素的<generator>子元素指定標識符生成器。
(3) 計劃執行一個insert語句,把Customer對象當前的屬性值組裝到insert語句中。
insert intoCUSTOMERS(ID, NAME, ......) values(1, "Tom", ......)
save()方法並不立即執行SQL insert語句。只有當Session清理緩存時,纔會執行SQL語句。
2、Session的update()方法
session.update(customer);完成的操作:
(1) 把Customer對象重新加入到Session緩存中,使它變爲持久化對象。
(2) 計劃執行一個update語句。Session只有在清理緩存時纔會執行update語句,並且在執行時纔會把Customer對象當前的屬性值組裝到update語句中。
(3) 只要通過update()方法使遊離對象被一個Session關聯,即使沒有修改Customer對象的任何屬性,Session在清理緩存時也會執行由update()方法計劃的update語句。
update CUSTOMERSset NAME="Tom", ...... where ID=1
如果希望Session僅當修改了Customer對象的屬性時,才執行update語句,可把映射文件Customer.hbm.xml中<class>元素的"select-before-update"設爲true(該屬性默認爲false)
<classname="mypack.Customer" table="CUSTOMERS"select-before-update="true">
當Session清理緩存時,先執行一條select語句,然後比較Customer對象的屬性是否和從數據庫中檢索出來的記錄一致,只有在不一致時才執行update語句。
3、Session的saveOrUpdate()方法
如果傳入的參數是臨時對象,就調用save()方法;如果傳入的參數是遊離對象,就調用update()方法;如果傳入的參數是持久化對象,那就直接返回。
Hibernate判斷臨時對象的條件:
(1)Java對象的OID取值爲null
(2)Java對象具有version屬性並且取值爲null
(3)在映射文件中爲<id>元素設置了unsaved-value屬性,並且OID取值與unsaved-value屬性只匹配
(4)在映射文件中爲version屬性設置了unsaved-value屬性,並且version屬性取值與unsaved-value屬性值匹配
(5)自定義了Hibernate的Interceptor實現類,並且Interceptor的isUnsaved()方法返回Boolean.TRUE
4、Session的load()方法和get()方法
根據給定的OID從數據庫中加載一個持久化對象。
當數據庫中不存在與OID對應的記錄時load()方法,返回ObjectNotFoundException異常get()方法,返null。
5、Session的delete()方法
如果傳入的參數是持久化對象,Session就計劃執行一個delete語句;如果傳入的參數是遊離對象,先使遊離對象被Session關聯,使它變爲持久化對象,然後計劃執行一個delete語句。
Session只有在清理緩存的時候纔會執行delete語句。只有當調用Session的close()方法時,纔會從Session的緩存中刪除該對象。
session.delete(customer);
session.delete("fromCustomer as c where c.id>8");