一.事務(wù)
Hibernate的任何對數(shù)據(jù)有改動的操作,都應(yīng)該被放在事務(wù)里面.
hibernate中的事務(wù)由s.beginTransaction();開始
//中間是多個操作啊,表類型必須是INNODB
由s.getTransaction().commit();結(jié)束
二.延遲加載lazyload
屬性延遲加載 當(dāng)使用load的方式來獲取對象的時候
只有訪問了這個對象的屬性
hibernate才會到數(shù)據(jù)庫中進行查詢。
否則不會訪問數(shù)據(jù)庫
Product p = (Product)s.load(Product.class, 1);
//還沒有訪問數(shù)據(jù)庫
System.out.println(p.getName());
//訪問屬性時才訪問數(shù)據(jù)庫
關(guān)系延遲加載 在one-many many-many的時可用
修改Category.hbm.xml中的<set name="products" lazy="true">
表示通過Category獲取產(chǎn)品是延遲加載的
Category c = (Category) s.get(Category.class, 1);
//只會查詢Category表的信息不會查詢product_表
System.out.println(c.getProducts());
//通過category取products時才會進行對product_表的查詢
三.級聯(lián)
四種級聯(lián)
all:所有操作都執(zhí)行級聯(lián)操作
none:所有操作都不執(zhí)行級聯(lián)操作
delete:刪除時執(zhí)行級聯(lián)操作
save-update:保存和更新時執(zhí)行級聯(lián)操作
1.delete級聯(lián)
在Category.hbm.xml加上
<set name="products" cascade="delete" lazy="false">
2.save-update級聯(lián)
<set name="products" cascade="save-update" lazy="false">
四.一級緩存
默認(rèn)開啟揽碘,存放在Session上
五.二級緩存
hibernate.cfg.xml 中增加對二級緩存的配置,存放在SessionFactory上
六.使用Criterria進行分頁查詢
無論使用的是Oracle,Mysql,NoSQL還是DB2,分頁查詢的代碼寫法都是一樣的
Criteria c= s.createCriteria(Product.class);
c.add(Restrictions.like("name", "%"+name+"%"));
c.setFirstResult(2);//表示從第二條數(shù)據(jù)開始
c.setMaxResults(5);//表示一共查詢5條數(shù)據(jù)
七.get/load獲取方式
是否延遲加載 id不存在對象
load 只有屬性被訪問時才會調(diào)用sql語句 拋出異常
get 無論后面是否訪問屬性馬上執(zhí)行sql語句 返回null
八.兩種獲得session方式
openSession 每次得到一個新的session
只有增加刪除修改需要事務(wù)卓研,查詢時不需要
getCurrentSession 在同一個線程每次都是相同的Session
所有操作都放在事務(wù)中進行淀衣,提交事務(wù)后session自動關(guān)閉炸茧,不能再進行關(guān)閉
九.N+1
1,就是指只返回id的SQL語句
N指的是如果在緩存中找不到對應(yīng)的數(shù)據(jù)玛荞,就到數(shù)據(jù)庫中去查
Hibernate有緩存機制,可以通過用id作為key把product對象保存在緩存中
首先通過Query的iterator把所有滿足條件的Product的id查出來
然后再通過it.next()查詢每一個對象
如果這個對象在緩存中呕寝,就直接從緩存中取了
否則就從數(shù)據(jù)庫中獲取
同時hibernate也提供Query的查詢方式勋眯。
假設(shè)數(shù)據(jù)庫中有100條記錄,其中有30條記錄在緩存中下梢,
但是使用Query的list方法客蹋,就會所有的100條數(shù)據(jù)都從數(shù)據(jù)庫中查詢,而無視這30條緩存中的記錄
十.查詢總數(shù)
Query q =s.createQuery("select count(*) from Product p where p.name like ?");
q.setString(0, "%"+name+"%");
long total= (Long) q.uniqueResult();
十一.樂觀鎖
十二.C3P0連接池