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
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é)管理的對象.
![]() | ![]() .. 定價(jià):¥225 優(yōu)惠價(jià):¥213 更多書籍 |
![]() | ![]() .. 定價(jià):¥133 優(yōu)惠價(jià):¥133.0 更多書籍 |