成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

精通Hibernate:通過Hibernate操縱對象

開發 后端
當應用程序通過new語句創建一個Java對象時,JVM會為這個對象分配一個內存空間,只要這個對象被引用變量引用,它就一直處在內存中。但是如果這個對象不被任何引用變量引用,它就結束生命周期,此時JVM的垃圾回收器會在適當的時候回收它占用的內存。

一、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接口的詳細用法

 

  1. public static void main(String[] args) throws Exception    
  2. 19.    {    
  3. 20.        //實例化Configuration     
  4. 21.        Configuration conf = new Configuration().configure();    
  5. 22.        //實例化SessionFactory     
  6. 23.        SessionFactory sf = conf.buildSessionFactory();    
  7. 24.        //實例化Session     
  8. 25.        Session sess = sf.openSession();    
  9. 26.        //開始事務     
  10. 27.        Transaction tx = sess.beginTransaction();    
  11. 28.        //創建消息實例     
  12. 29.        News n = new News();    
  13. 30.        //設置消息標題和消息內容     
  14. 31.        n.setTitle("瘋狂Java聯盟成立了");    
  15. 32.        n.setContent("瘋狂Java聯盟成立了,網址是www.crazyit.org");    
  16. 33.        //保存消息     
  17. 34.        sess.save(n);    
  18. 35.        //提交事務     
  19. 36.        tx.commit();    
  20. 37.        //關閉Session     
  21. 38.        sess.close();    
  22. 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()方法執行之后才會保存數據。

  1. import org.hibernate.Session;  
  2. import org.hibernate.SessionFactory;  
  3. import org.hibernate.Transaction;  
  4. import org.hibernate.cfg.Configuration;  
  5. import java.util.Date;  
  6.  
  7. public class HibernateTest {  
  8.     public static void main(String[] args) {  
  9.         Configuration config = new Configuration();  
  10.         config.configure();  
  11.         SessionFactory sessionFactory = config.buildSessionFactory();  
  12.         Session session = sessionFactory.getCurrentSession();  
  13.         Transaction tx = session.beginTransaction();  
  14.  
  15.         Guestbook gb = new Guestbook();  
  16.         gb.setName("劉偉");  
  17.         gb.setPhone("01082622285");  
  18.         gb.setEmail("liuwei8809@163.com");  
  19.         gb.setTitle("大家好");  
  20.         gb.setContent("歡迎大家學習Hibernate技術。");  
  21.         gb.setCreatedTime(new Date());  
  22.  
  23.         session.save(gb);  
  24.         tx.commit();  
  25.         sessionFactory.close();  
  26.     }  

2)get()/load()方法

通過Session對象的get()方法可以獲取數據庫中的一條記錄,如:

  1. Guestbook gb=(Guestbook) session.get(Guestbook.class,new Integer(1));//查找Guestbook中id為1的記錄 

get()方法的***個參數是持久化對象,第二個參數是要查找的持久化對象的標識符屬性值。

通過Session對象的load()方法可以獲取數據庫中的一條記錄,如:

  1. 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

【編輯推薦】

  1. 精通Hibernate:映射對象標識符
  2. 精通Hibernate:映射一對多關聯關系
  3. 精通Hibernate:對象關系映射基礎
  4. 精通Hibernate:***個Hibernate應用
  5. Hibernate緩存何時使用和如何使用
責任編輯:林師授 來源: yu422560654的博客
相關推薦

2012-02-08 12:17:38

HibernateJava

2012-02-08 14:01:18

HibernateJava

2009-09-25 10:25:54

Hibernate緩存

2012-02-08 11:15:38

HibernateJava

2009-09-23 10:14:10

Hibernate使用

2009-09-29 10:46:58

Hibernate領域

2009-09-25 13:14:58

Hibernate C

2009-09-22 11:27:41

模型對象Hibernate

2009-09-23 13:26:10

Hibernate對象

2009-09-24 15:42:44

Hibernate對象

2009-09-23 10:41:10

對象標識符Hibernate

2009-09-25 14:41:15

Hibernate對象

2009-09-29 16:11:45

Hibernate實現

2012-02-08 13:34:08

HibernateJava

2009-09-24 17:28:29

Hibernate S

2009-06-30 16:41:12

Hibernate的事

2009-06-18 10:41:18

Hibernate3.Hibernate3.

2009-06-18 11:43:40

Hibernate uHibernate s

2009-06-26 16:31:50

區分不同對象Hibernate

2009-06-17 15:06:50

Hibernate實體
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九九久久这里只有精品 | 午夜资源| 亚洲欧美日韩精品久久亚洲区 | 亚洲九九精品 | 日韩精品在线网站 | 天堂在线免费视频 | 久久激情网 | 91视频免费观看 | 欧美a区| 亚洲视频www| 玖玖玖av| 一级片网址 | 欧美 日韩 在线播放 | 国产日产精品一区二区三区四区 | 精久久久 | 日韩在线免费 | 国产激情偷乱视频一区二区三区 | 国产精品精品视频一区二区三区 | 中文字幕一区二区三区不卡 | 国产精品一区二区三区在线 | 日韩一区二区视频 | 精品国产乱码久久久久久蜜柚 | 久久鲁视频| 久久久久国产一区二区三区 | 国产成人99久久亚洲综合精品 | 99re在线视频 | 久久国产精品免费 | 国内自拍偷拍 | 亚洲精品资源 | 精品一区免费 | 成人国产精品 | 在线国产视频 | 久久久美女 | 91在线成人 | 玖玖色在线视频 | 久久久国产精品 | www.99re| 日日操夜夜操天天操 | 亚洲视频欧美视频 | 在线午夜 | 精品欧美一区二区三区久久久 |