1. 程式人生 > >Hibernate學習—— 一級快取&快照

Hibernate學習—— 一級快取&快照

上一篇說到,Hibernate框架中,物件轉化為持久化狀態後,會在事務提交時,自動將物件屬性儲存到資料庫,而在事務提交之前,我們是對哪裡的物件進行操作呢,這就是一級快取(Session快取)的作用。

  • 我們在將物件轉化為持久化狀態時,就是將這個物件儲存到了一級快取中,在這之後和事務提交之前,我們對物件進行的所有操作都會同步到session快取中,在事務提交時,Hibernate會將這個物件的資訊根據配置檔案對應關係(屬性名對應列名)儲存到資料庫中。

快照:快照可以說是與快取對應的關係

通過前面學習知道:當通過new建立一個物件c,並將其與session關聯後,c就儲存到了快取中,此時在事務提交時將其儲存到資料庫中,但是在另一種情況下:

如:

Customer c1=session.get(Customer.class, 1l);// 假設c1原本的name為  胡胡
c1.setCust_name("胡一");
c1.setCust_name("胡二");
c1.setCust_name("胡胡");

tst.commit();  // 事務提交

以上這種情況,通過測試可以知道,獲得c1後,事務提交時,框架並沒有幫我們執行任何資料庫操作,這就是快照的作用。

  • 當通過直接get的方式獲得物件時,此時物件直接就是持久化狀態,Hibernate會將物件的原始資料拷貝兩份儲存,一份放在session快取中,另一份放在快照中,當用戶操作完畢後,操作的是快取中的資料,Hibernate將操作後快取中的資料與快照中的原始資料進行比較,如果比較發現兩份資料不相同,則將快取中的資料儲存到資料庫中,如果發現相同,Hibernate則不會進行任何資料庫操作。這就是快照的作用。

 當新new出來的物件與session關聯時,快照中是不儲存這個物件的任何資訊的,所以當事務提交時,快取與快照比較當然會不同,所以講新資料儲存到資料庫。