Hibernate總結——Session_2

作者:李東龍


      上篇博客對數據持久化狀態做了一些補充之後,下面來全面瞭解一下Session。看看Session都有那些作用和方法。


    一、     緩存作用

a)     減少訪問數據庫的頻率。

b)    保證緩存中的對象與數據庫中的相關記錄保持同步。

        Session有兩個方法:一個commit()事務提交方法,還有flush()刷新緩存方法,都有着清理緩存的作用。flush()進行緩存的清理,執行一系列的SQL語句,但不會提交事務。而commit()方法會先調用flush()方法,然後在提交事務。

 

    二、     控制java對象持久化操作 

 1Sessionsave()方法

    session.save(customer);完成的操作:

    (1)  Customer對象加載到緩存中,使它變爲持久化對象。

    (2)  選用映射文件指定的標識符生成器爲持久化對象分配唯一的OIDCustomer.hbm.xml文件中<id>元素的<generator>子元素指定標識符生成器。

    (3)  計劃執行一個insert語句,把Customer對象當前的屬性值組裝到insert語句中。

    insert intoCUSTOMERS(ID, NAME, ......) values(1, "Tom", ......)

    save()方法並不立即執行SQL insert語句。只有當Session清理緩存時,纔會執行SQL語句。


2Sessionupdate()方法

     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語句。


3SessionsaveOrUpdate()方法

     如果傳入的參數是臨時對象,就調用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)自定義了HibernateInterceptor實現類,並且InterceptorisUnsaved()方法返回Boolean.TRUE


4Sessionload()方法和get()方法

         根據給定的OID從數據庫中加載一個持久化對象。

         當數據庫中不存在與OID對應的記錄時load()方法,返回ObjectNotFoundException異常get()方法,返null


5Sessiondelete()方法

      如果傳入的參數是持久化對象,Session就計劃執行一個delete語句;如果傳入的參數是遊離對象,先使遊離對象被Session關聯,使它變爲持久化對象,然後計劃執行一個delete語句。

      Session只有在清理緩存的時候纔會執行delete語句。只有當調用Sessionclose()方法時,纔會從Session的緩存中刪除該對象。

      session.delete(customer);

      session.delete("fromCustomer as c where c.id>8");


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章