精通Hibernate:通過Hibernate操縱對象
一、Java對象在JVM中的生命周期
當應用程序通過new語句創建一個Java對象時,JVM會為這個對象分配一個內存空間,只要這個對象被引用變量引用,它就一直處在內存中。但是如果這個對象不被任何引用變量引用,它就結束生命周期,此時JVM的垃圾回收器會在適當的時候回收它占用的內存。
二、理解Session的緩存
如果希望一個Java對象A一直處于生命周期中,就必須保證至少有一個對象保持對它的引用或者可以從其他處于生命周期中的對象B導航到這個對象A,比如在對象B的Java組合中存放了對象A的引用。在Session接口的實現中包含一系列的Java集合,這些Java集合構成了Session緩存。如下圖所示:
當Session的save()方法持久化一個Customer對象時,Customer對象就被加入到Session緩存中,以后即使不被調用,只要Session緩存沒有清空,Customer對象就仍然處在生命周期。
當Session的get()方法試圖從數據庫中加載一個Customer對象時,Session先判斷緩存中是否已經存在這個Customer對象,如果存在,就不需要再到數據庫中檢索,而直接存緩存中獲得這個Customer對象。
◆ Session緩存的三大作用
(1)減少訪問數據庫的頻率;
(2)當緩存中的持久化對象之間存在循環關聯關系時,Session會保證不會出現訪問對象圖的死循環以及由死循環引起的JVM堆棧溢出異常;
(3)保證數據庫中的相關記錄與緩存中的相應對象保持同步。
◆ 臟檢查以及清理緩存的機制
當一個Customer對象被加入到Session中時,Session會為其做一個快照。當Session執行清理緩存時,它會將Customer當前屬性和快照進行比較,如果發生變化,就稱這個對象為“臟對象”,Session會根據對象的***屬性來執行相關的SQL語句,從而同步更新數據庫。這即是Session緩存三大作用の第三個。
當Session緩存中對象的屬性發生變化時,Session并不會立即清理緩存執行相關SQL語句,而是在特定的時間點才會清理緩存,這使得Session能夠把幾條相關的SQL語句合并成一條SQL語句,以便減少訪問數據庫的次數,從而提高性能。
三、Java對象在Hibernate持久化層的狀態
四、Session接口的詳細用法
- public static void main(String[] args) throws Exception
- 19. {
- 20. //實例化Configuration
- 21. Configuration conf = new Configuration().configure();
- 22. //實例化SessionFactory
- 23. SessionFactory sf = conf.buildSessionFactory();
- 24. //實例化Session
- 25. Session sess = sf.openSession();
- 26. //開始事務
- 27. Transaction tx = sess.beginTransaction();
- 28. //創建消息實例
- 29. News n = new News();
- 30. //設置消息標題和消息內容
- 31. n.setTitle("瘋狂Java聯盟成立了");
- 32. n.setContent("瘋狂Java聯盟成立了,網址是www.crazyit.org");
- 33. //保存消息
- 34. sess.save(n);
- 35. //提交事務
- 36. tx.commit();
- 37. //關閉Session
- 38. sess.close();
- 39. }
1、Configuration類
2、SessionFactory接口
使用SessionFactory對象可以獲取Session對象。
3、Session(會話)接口
Session接口是Hibernate中的核心接口,它不是Java Web應用中HttpSession接口。Hibernate操作數據庫之前必須先獲取一個Session對象,相當于JDBC在操作數據庫之前必須獲取一個Connection對象一樣。
//也可以使用Session session=session.openSession()方法
獲取Session對象后,Hibernate內部并不會獲取操作數據庫的java.sql.Connection對象,而是等待Session對象真正需要對數據庫進行CRUD等操作時,才會從數據庫連接池中獲取java.sql.Connection對象。而關閉Session對象時,則是將java.sql.Connection對象返回到連接池中,而不是直接關閉java.sql.Connection對象。
1)save()方法
save()方法是用來保存持久化對象,進而在數據庫中新增一條數據的方法;執行save()方法之后不會立即操作數據庫來進行保存數據,而是在Transaction對象的commit()方法執行之后才會保存數據。
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.Transaction;
- import org.hibernate.cfg.Configuration;
- import java.util.Date;
- public class HibernateTest {
- public static void main(String[] args) {
- Configuration config = new Configuration();
- config.configure();
- SessionFactory sessionFactory = config.buildSessionFactory();
- Session session = sessionFactory.getCurrentSession();
- Transaction tx = session.beginTransaction();
- Guestbook gb = new Guestbook();
- gb.setName("劉偉");
- gb.setPhone("01082622285");
- gb.setEmail("liuwei8809@163.com");
- gb.setTitle("大家好");
- gb.setContent("歡迎大家學習Hibernate技術。");
- gb.setCreatedTime(new Date());
- session.save(gb);
- tx.commit();
- sessionFactory.close();
- }
- }
2)get()/load()方法
通過Session對象的get()方法可以獲取數據庫中的一條記錄,如:
- Guestbook gb=(Guestbook) session.get(Guestbook.class,new Integer(1));//查找Guestbook中id為1的記錄
get()方法的***個參數是持久化對象,第二個參數是要查找的持久化對象的標識符屬性值。
通過Session對象的load()方法可以獲取數據庫中的一條記錄,如:
- Guestbook gb=(Guestbook) session.load(Guestbook.class,new Integer(1));//查找Guestbook中id為1的記錄
兩者之間的區別:load()和get()在未找到符合條件的持久化對象的時候,load()會拋出一個違例,而get()方法返回null。另外兩者對緩存對象的讀取也不同,load()方法會先從Hibernate的一級緩存中去查找符合條件的對象,找不到的話則會去Hibernate的二級緩存中去查找對象,仍未找到的話才會去數據庫中去查找;但是get()方法不會去查找Hibernate的二級緩存。
3)update()方法
4)delete()方法
4、Transaction(事務)接口
5、Query接口
6、Criteria接口
原文鏈接:http://blog.csdn.net/yu422560654/article/details/7007978
【編輯推薦】