1.文章轉載於:http://www.techrss.cn/html/2008/04-08/79497.htm
2.1 Hibernate實體對象的三種狀態
(1)Transient:所謂Transient就是說實體對象在內存中存在,與數據庫的記錄無關。
(2)Persient:Persient對象對應數據庫中的一條記錄,也可以這樣子理解,如果一個實體對象與某個session發生關聯,並處於對應session的有效期內,那麼它就處於Persient狀態。
(3)Detached:所謂Detached就是處於Persient狀態對應的session關閉之後的狀態。
我們平時所說的PO(持久化對象)指的是位於Persient狀態的對象,而VO(值對象)就是指Transient和Detached狀態的對象。
2.2CRUD
(1)save()方法,調用save方法時,首先會在session緩存中查找保存對象,如果實體對象已經處於Persient狀態,則直接返回,否則執行SQL操作,將保存的實體對象加入session緩存中(save方法不會把實體加入到二級緩存的),最後對存在的級聯關係進行遞歸處理。
(2)saveOrUpdate()方法:和save一樣首先在session緩存中查找,判斷對象是否爲保存狀態,如果對象處於Persient,不執行操作,處於Transient執行save操作,處於Detached調用save將對象與session重新關聯。
這裏要注意的是在批量操作時要適時地對session進行flush操作,避免出現OutOfMemoryError。(開發中設置一個計數器,到達某個臨界值的時候就清空一次就可以啦)
2.3 查詢
查詢是受緩存影響最大的。
(1)session的load()和get():這兩者的區別主要是load會在二級緩存中查找,而get在內容緩存中查找不到的話將跳過二級緩存直接進行SQL操作。
(2)Query的list()和iterate()方法:list實際上無法使用緩存,它對緩存只寫不讀,而iterate則是首先查找所有符合條件的id(首先在本地緩存中查找)在執行相應的select獲得對應記錄,iterate方法的使用是查找的實體對象在緩存中已經存在了,否則查詢性能很低,容易產生N+1現象