hibernate中實體類對象的狀態
在hibernate中實體類對象有三種狀態
(1)瞬時態(臨時態)
瞬時態:即我們自己創建一個對象,還沒有保存到數據庫就叫臨時態,其實也可以說是對像沒有id值,跟session沒有關系(或者是一級緩存中不存在),即是臨時態。
(2)持久態
持久態:即,此對象是我們從數據庫中獲取到的,即是持久太,簡單的說就是,對象有id值,跟session有關系(或者說是一級緩存中存在),即是持久態。
(3)托管態(游離態)
托管態:即,此對象有id值,但是跟session 沒有關系(或者說是一級緩存中不存在),即是托管態。
瞬時態———通過保存方法———持久態———通過get()方法———游離態。
其中實體類對象的狀態會影響到方法的執行:
就比如saveOrUpdate()方法執行的時候:
(1)對象是瞬時態的話,會執行insert語句。
(2)對像是托管態的時候就會做修改操作(update)
(3)持久態的時候也能做修改操作,但是這里就涉及到持久態對象會在事物的提交的時候自動跟新到數據庫。
問候一下hibernate一級緩存他老人家
數據一般是存在數據庫里面,而數據庫本身是一個文件系統,而文件系統的讀取就需要用到文件流了,而讀取數據的時候使用文件流的方式操作,效率不是很高的,而考慮到這種情況,我們就可以想想
是不是可以把數據放到系統的內存中去從而提高數據的讀取效率,而把數據放到系統的內存中去就是我們所說的緩存數據,即緩存。
那什么是hibernate緩存呢?
那就是hibernate提供了一種優化的方式,可以把數據直接放到內存中,這就是hibernate緩存,其實hibernate一級緩存是hibernate框架中的一種優化的機制。(優化機制我自己的理解就是一種提高程序或者框架性能或者效率的一種“方法”)。
hibernate一級緩存默認是打開的。
hibernate一級緩存有它的使用范圍那就是session范圍(從session創建到session關閉(事物提交或者手動關閉session)。
一級緩存的道路怎么走
在查詢數據庫的數據時候,hibernate首先去查的不是數據庫,而是一級緩存區域,會先去一級緩存中去查詢,如果查詢的結果存在那就直接返回不會再去數據庫中查詢數據,但是如果查詢的數據一級緩存中不存在,
那就會去數據庫中去查,從數據庫中拿到數據之后會同時做兩件事那就是把查詢的數據返回還有就是把數據放到一級緩存中的緩存區以及快照區中,那我們第二次再次查詢這個數據的時候就會直接從緩存中查詢就不會進入數據庫中進行查詢了。
這樣就可以減少對數據庫的操作,從而達到提高程序的性能以及效率。
一級緩存中的家族產業
一級緩存分為:緩存區和快照區。
緩存區:就比如我們在調用hibernate中的調用方法查詢到數據庫並拿到了數據庫對象的時候,hibernate會首先把查詢的數據對象放到一級緩存和快照區中,但是當我們對這個對象我們查詢的數據對象進行修改的時候(當然對象必須在存在於Hibernate一級緩存中且session沒有關閉的情況下。)我們修改的只是修改緩存區中的內容,而不會修改快照區的內容,這是一個最重要的機制,我感覺這鍾機制真的很牛bi,hibernate只是修改緩存中的數據,而不修改快照區中的內容,但是在提交事物的時候hibernate框架會自動的去拿緩存區和快照區的內容進行對比,如果快照區與緩存區的內容是一致的,那就不會去更新到數據庫,但是如果是不一樣的那就會自動的更新到數據庫。這種機制又是提高Hibernate框架的執行效率。
快照區:快照區,什么是快照區,快照區為什么叫快照區,其實可以這么理解快照區,快照區就是存放照片的,只不過是這個照片有點獨特,那就是這個照片是從數據庫中拿到的數據的照片。快照區所做的事就是在數據放入緩存區的同時對數據進行“拍照”對其進行記錄。以便在以后緩存區中的數據修改的時候進行對比看數據是否發生了變化,如果變化那就更新到數據庫,其實到這里也就容易理解為什么我們在修改對象的時候緩存區中的數據會發生相應的改變而快照區不會發生改變了。是因為快照區中存的是“照片”嘛。照片的內容我們是改變不了的,不是嗎?