1.Hibernate框架的特性
1)一級(jí)緩存
session對(duì)象級(jí)別的緩存,利用該session取出的對(duì)象會(huì)放到緩存中.在后續(xù)查詢時(shí),首先去緩存中尋找,沒(méi)有再去數(shù)據(jù)庫(kù)尋找.
session緩存區(qū)在session關(guān)閉后銷毀.session復(fù)雜維護(hù)緩存區(qū)中對(duì)象的狀態(tài).
在使用時(shí),為了更好發(fā)揮一級(jí)緩存,需要保障同一個(gè)線程處理中,使用同一個(gè)Session對(duì)象.
a.使用ThreadLocal對(duì)SessionUtil進(jìn)行改造,將Session對(duì)象與ThreadLocal綁定.
public class HibernateUtil {
private static 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
一級(jí)緩存的管理:
session.evict(obj);將obj對(duì)象從當(dāng)前session的一級(jí)緩存中清除.
session.clear():清除當(dāng)前session的一級(jí)緩存.
2)延遲加載
當(dāng)獲取一個(gè)實(shí)體對(duì)象后,實(shí)體對(duì)象并沒(méi)有立刻發(fā)送SQL語(yǔ)句,去數(shù)據(jù)庫(kù)加載數(shù)據(jù).而是在調(diào)用對(duì)象的getXXX()方法時(shí)采取加載數(shù)據(jù).
支持延遲加載的方法:session.load(),query.iterator().延遲加載方法返回的對(duì)象類型,是動(dòng)態(tài)代理類型.
session.get()和session.load()方法功能是按主鍵做條件查詢數(shù)據(jù),區(qū)別
如下:
a.get()方法不支持延遲加載,load()方法支持
b.如果數(shù)據(jù)表中沒(méi)有符合的記錄,get()方法返回null,load()拋異常
c.如果數(shù)據(jù)表中有符合的記錄,get()返回的是實(shí)體類型對(duì)象,load()返回的是動(dòng)態(tài)代理類型對(duì)象.
在使用時(shí),需要注意以下事項(xiàng):
a.使用延遲加載的API后,避免過(guò)早的關(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)代理類,并重寫(xiě)對(duì)象的getXXX()方法,當(dāng)調(diào)用get方法時(shí),觸發(fā)SQL查詢,去數(shù)據(jù)庫(kù)加載數(shù)據(jù).
Hibernate動(dòng)態(tài)生成代理類型機(jī)制:
以前編寫(xiě)程序:
a.編寫(xiě)一個(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,對(duì)其擴(kuò)展,在內(nèi)存中生成一個(gè)代理類型.該代理類是原類型的一個(gè)子類.
3)Hibernate中對(duì)象的狀態(tài)
在Hibernate使用中,對(duì)象的狀態(tài)有以下三種
a.臨時(shí)對(duì)象 : 在程序中使用new方式創(chuàng)建的對(duì)象
b.持久對(duì)象 : 在程序中與session對(duì)象關(guān)聯(lián),由session負(fù)責(zé)管理的對(duì)象.
2015年全國(guó)職稱計(jì)算機(jī)考試教材(2007模 .. 定價(jià):¥225 優(yōu)惠價(jià):¥213 更多書(shū)籍 | |
全國(guó)職稱計(jì)算機(jī)考試速成過(guò)關(guān)系列套裝:W .. 定價(jià):¥133 優(yōu)惠價(jià):¥133.0 更多書(shū)籍 |