日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
精通Hibernate:通過Hibernate操縱對象

一、Java對象在JVM中的生命周期

創(chuàng)新互聯(lián)于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站建設(shè)、成都網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元都江堰做網(wǎng)站,已為上家服務(wù),為都江堰各地企業(yè)和個人服務(wù),聯(lián)系電話:18980820575

當(dāng)應(yīng)用程序通過new語句創(chuàng)建一個Java對象時,JVM會為這個對象分配一個內(nèi)存空間,只要這個對象被引用變量引用,它就一直處在內(nèi)存中。但是如果這個對象不被任何引用變量引用,它就結(jié)束生命周期,此時JVM的垃圾回收器會在適當(dāng)?shù)臅r候回收它占用的內(nèi)存。

二、理解Session的緩存

如果希望一個Java對象A一直處于生命周期中,就必須保證至少有一個對象保持對它的引用或者可以從其他處于生命周期中的對象B導(dǎo)航到這個對象A,比如在對象B的Java組合中存放了對象A的引用。在Session接口的實現(xiàn)中包含一系列的Java集合,這些Java集合構(gòu)成了Session緩存。如下圖所示:

當(dāng)Session的save()方法持久化一個Customer對象時,Customer對象就被加入到Session緩存中,以后即使不被調(diào)用,只要Session緩存沒有清空,Customer對象就仍然處在生命周期。

當(dāng)Session的get()方法試圖從數(shù)據(jù)庫中加載一個Customer對象時,Session先判斷緩存中是否已經(jīng)存在這個Customer對象,如果存在,就不需要再到數(shù)據(jù)庫中檢索,而直接存緩存中獲得這個Customer對象。

◆  Session緩存的三大作用

(1)減少訪問數(shù)據(jù)庫的頻率;

(2)當(dāng)緩存中的持久化對象之間存在循環(huán)關(guān)聯(lián)關(guān)系時,Session會保證不會出現(xiàn)訪問對象圖的死循環(huán)以及由死循環(huán)引起的JVM堆棧溢出異常;

(3)保證數(shù)據(jù)庫中的相關(guān)記錄與緩存中的相應(yīng)對象保持同步。

◆ 臟檢查以及清理緩存的機制

當(dāng)一個Customer對象被加入到Session中時,Session會為其做一個快照。當(dāng)Session執(zhí)行清理緩存時,它會將Customer當(dāng)前屬性和快照進行比較,如果發(fā)生變化,就稱這個對象為“臟對象”,Session會根據(jù)對象的***屬性來執(zhí)行相關(guān)的SQL語句,從而同步更新數(shù)據(jù)庫。這即是Session緩存三大作用の第三個。

當(dāng)Session緩存中對象的屬性發(fā)生變化時,Session并不會立即清理緩存執(zhí)行相關(guān)SQL語句,而是在特定的時間點才會清理緩存,這使得Session能夠把幾條相關(guān)的SQL語句合并成一條SQL語句,以便減少訪問數(shù)據(jù)庫的次數(shù),從而提高性能。

三、Java對象在Hibernate持久化層的狀態(tài)

四、Session接口的詳細(xì)用法

 
 
 
 
  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.        //開始事務(wù)   
  10. 27.        Transaction tx = sess.beginTransaction();  
  11. 28.        //創(chuàng)建消息實例   
  12. 29.        News n = new News();  
  13. 30.        //設(shè)置消息標(biāo)題和消息內(nèi)容   
  14. 31.        n.setTitle("瘋狂Java聯(lián)盟成立了");  
  15. 32.        n.setContent("瘋狂Java聯(lián)盟成立了,網(wǎng)址是www.crazyit.org");  
  16. 33.        //保存消息   
  17. 34.        sess.save(n);  
  18. 35.        //提交事務(wù)   
  19. 36.        tx.commit();  
  20. 37.        //關(guān)閉Session   
  21. 38.        sess.close();  
  22. 39.    }  

1、Configuration類

2、SessionFactory接口

使用SessionFactory對象可以獲取Session對象。

3、Session(會話)接口

Session接口是Hibernate中的核心接口,它不是Java Web應(yīng)用中HttpSession接口。Hibernate操作數(shù)據(jù)庫之前必須先獲取一個Session對象,相當(dāng)于JDBC在操作數(shù)據(jù)庫之前必須獲取一個Connection對象一樣。

//也可以使用Session session=session.openSession()方法

獲取Session對象后,Hibernate內(nèi)部并不會獲取操作數(shù)據(jù)庫的java.sql.Connection對象,而是等待Session對象真正需要對數(shù)據(jù)庫進行CRUD等操作時,才會從數(shù)據(jù)庫連接池中獲取java.sql.Connection對象。而關(guān)閉Session對象時,則是將java.sql.Connection對象返回到連接池中,而不是直接關(guān)閉java.sql.Connection對象。

1)save()方法

save()方法是用來保存持久化對象,進而在數(shù)據(jù)庫中新增一條數(shù)據(jù)的方法;執(zhí)行save()方法之后不會立即操作數(shù)據(jù)庫來進行保存數(shù)據(jù),而是在Transaction對象的commit()方法執(zhí)行之后才會保存數(shù)據(jù)。

 
 
 
 
  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. public class HibernateTest {
  7.     public static void main(String[] args) {
  8.         Configuration config = new Configuration();
  9.         config.configure();
  10.         SessionFactory sessionFactory = config.buildSessionFactory();
  11.         Session session = sessionFactory.getCurrentSession();
  12.         Transaction tx = session.beginTransaction();
  13.         Guestbook gb = new Guestbook();
  14.         gb.setName("劉偉");
  15.         gb.setPhone("01082622285");
  16.         gb.setEmail("liuwei8809@163.com");
  17.         gb.setTitle("大家好");
  18.         gb.setContent("歡迎大家學(xué)習(xí)Hibernate技術(shù)。");
  19.         gb.setCreatedTime(new Date());
  20.         session.save(gb);
  21.         tx.commit();
  22.         sessionFactory.close();
  23.     }
  24. }

2)get()/load()方法

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

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

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

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

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

兩者之間的區(qū)別:load()和get()在未找到符合條件的持久化對象的時候,load()會拋出一個違例,而get()方法返回null。另外兩者對緩存對象的讀取也不同,load()方法會先從Hibernate的一級緩存中去查找符合條件的對象,找不到的話則會去Hibernate的二級緩存中去查找對象,仍未找到的話才會去數(shù)據(jù)庫中去查找;但是get()方法不會去查找Hibernate的二級緩存。

3)update()方法

4)delete()方法

4、Transaction(事務(wù))接口

5、Query接口

6、Criteria接口


網(wǎng)站欄目:精通Hibernate:通過Hibernate操縱對象
網(wǎng)頁網(wǎng)址:http://www.5511xx.com/article/ccicdci.html