华南俳烁实业有限公司

考試首頁 | 考試用書 | 培訓(xùn)課程 | 模擬考場 | 考試論壇  
全國  |             |          |          |          |          |         
  當(dāng)前位置:計(jì)算機(jī)等級 > 二級考試 > Java語言程序設(shè)計(jì) > 考試輔導(dǎo) > 文章內(nèi)容
  

全國計(jì)算機(jī)等級考試二級Java重點(diǎn)內(nèi)容(54)

中華IT學(xué)院   【 】  [ 2016年11月21日 ]

 

1.Hibernate框架的特性

  1)一級緩存

      session對象級別的緩存,利用該session取出的對象會放到緩存中.在后續(xù)查詢時(shí),首先去緩存中尋找,沒有再去數(shù)據(jù)庫尋找.

      session緩存區(qū)在session關(guān)閉后銷毀.session復(fù)雜維護(hù)緩存區(qū)中對象的狀態(tài).

      在使用時(shí),為了更好發(fā)揮一級緩存,需要保障同一個(gè)線程處理中,使用同一個(gè)Session對象.

a.使用ThreadLocal對SessionUtil進(jìn)行改造,將Session對象與ThreadLocal綁定.

public class HibernateUtil {

         private static ThreadLocal tl=new ThreadLocal();

         private static Configuration conf;

         private static SessionFactory factory;

static {conf=new Configuration();factory=conf.buildSessionFactory();}

public static  Session getSession(){ Session session=tl.get();

         if(session==null){ session=factory.openSession(); tl.set(session);}return session; }

         public static Session closeSession(){ Session session=tl.get(); if(session!=null){session.close();tl.set(null);

                   }return session;}}

    b.Hibernate3之后的新版本,可以使用以下方法

      首先在hibernate.cfg.xml中添加配置

     

                   thread

     

      之后使用sessionFactory.getCurrentSession()方法獲取Session

 

    注意:在使用此session時(shí),必須將session操作封裝在一個(gè)transaction

  

    一級緩存的管理:

     session.evict(obj);將obj對象從當(dāng)前session的一級緩存中清除.

     session.clear():清除當(dāng)前session的一級緩存.

 

  2)延遲加載

    當(dāng)獲取一個(gè)實(shí)體對象后,實(shí)體對象并沒有立刻發(fā)送SQL語句,去數(shù)據(jù)庫加載數(shù)據(jù).而是在調(diào)用對象的getXXX()方法時(shí)采取加載數(shù)據(jù).

    支持延遲加載的方法:session.load(),query.iterator().延遲加載方法返回的對象類型,是動(dòng)態(tài)代理類型.

    session.get()和session.load()方法功能是按主鍵做條件查詢數(shù)據(jù),區(qū)別

如下:   

    a.get()方法不支持延遲加載,load()方法支持

    b.如果數(shù)據(jù)表中沒有符合的記錄,get()方法返回null,load()拋異常

    c.如果數(shù)據(jù)表中有符合的記錄,get()返回的是實(shí)體類型對象,load()返回的是動(dòng)態(tài)代理類型對象.

  

    在使用時(shí),需要注意以下事項(xiàng):

      a.使用延遲加載的API后,避免過早的關(guān)閉Session.

LazyInitializationException: could not initialize proxy - no Session

      b.根據(jù)需要選擇延遲加載和非延遲加載API

-----------------了解---------------------- 

   Hibernate延遲加載機(jī)制:利用動(dòng)態(tài)生成代理類型機(jī)制生成一個(gè)動(dòng)態(tài)代理類,并重寫對象的getXXX()方法,當(dāng)調(diào)用get方法時(shí),觸發(fā)SQL查詢,去數(shù)據(jù)庫加載數(shù)據(jù).

   Hibernate動(dòng)態(tài)生成代理類型機(jī)制:

   以前編寫程序:

     a.編寫一個(gè)類源碼

     b.調(diào)用編譯器將源碼編譯成class字節(jié)碼

     c.類加載器將字節(jié)碼文件載入虛擬機(jī)內(nèi)容

     d.虛擬機(jī)調(diào)用字節(jié)碼文件的方法,解釋運(yùn)行

   Session.load()等延遲方法返回的類型是Foo$Enhancer$CGLIB....,

這些類型是Hibernate框架利用程序在內(nèi)容中動(dòng)態(tài)生成并編譯的類型.

上述功能,是Hibernate調(diào)用asm.jar,cglib-2.1.3.jar工具包完成的.

   asm.jar主要用于在內(nèi)存中動(dòng)態(tài)和編譯生成一個(gè)類

   cglib.jar是基于asm.jar,對其擴(kuò)展,在內(nèi)存中生成一個(gè)代理類型.該代理類是原類型的一個(gè)子類.

  3)Hibernate中對象的狀態(tài)

    在Hibernate使用中,對象的狀態(tài)有以下三種

    a.臨時(shí)對象 : 在程序中使用new方式創(chuàng)建的對象

    b.持久對象 : 在程序中與session對象關(guān)聯(lián),由session負(fù)責(zé)管理的對象.

首頁 1 2 尾頁
分享到:
本文糾錯(cuò)】【告訴好友】【打印此文】【返回頂部
將考試網(wǎng)添加到收藏夾 | 每次上網(wǎng)自動(dòng)訪問考試網(wǎng) | 復(fù)制本頁地址,傳給QQ/MSN上的好友 | 申請鏈接 | 意見留言 TOP
關(guān)于本站  網(wǎng)站聲明  廣告服務(wù)  聯(lián)系方式  站內(nèi)導(dǎo)航  考試論壇
Copyright © 2006-2017 中華考試網(wǎng)(Examw.com) All Rights Reserved  營業(yè)執(zhí)照
五家渠市| 靖安县| 池州市| 聂拉木县| 赤城县| 达拉特旗| 惠安县| 岳阳县| 清镇市| 汉川市| 渭南市| 桂阳县| 遂溪县| 四子王旗| 开江县| 梨树县| 长白| 辉南县| 根河市| 福州市| 晴隆县| 甘肃省| 贡觉县| 昌都县| 玉溪市| 尚义县| 女性| 报价| 昌江| 波密县| 石屏县| 紫云| 黔西县| 娄底市| 平度市| 泗阳县| 康乐县| 扶沟县| 古交市| 榆树市| 庆元县|