1. 程式人生 > >Hibernate面試要點

Hibernate面試要點

get和load的區別:
1>不存在對應記錄時表現不一樣
2>load返回的是代理物件(javassist.jar生成二進位制碼),等到真正用到物件的內容才會發出SQL語句
3>get直接從資料庫載入,不會延遲
無論是get還是load,都會首先查詢快取(一級快取),如果沒有,才會去資料庫查詢,呼叫clear()方法,可以強制清除session快取
呼叫flush()方法可以強制進行從記憶體到資料庫的同步。
SessionFactory
1>用來管理Session
2>通常情況下每個應用只需要一個SessionFactory
3>除非要訪問多個數據庫的情況
4>關注兩個方法即可
i>openSession每次都是新的,需要close();
ii>getCurrentSession從上下文找,如果有,用舊的,如果沒有,建立新的
a>用途,界定事務邊界
b>事務提交自動close;
c>current_session_context_class(jta或者thread)
thread使用connection
<一>list和iterate的區別:
a>list取出所有
b>iterate取出id,等要用的時候再根據id取出物件
c>session中的list第二次發出,仍然會倒資料庫查詢
d>iterate第二次,首先找session級快取
getCurrentSession()一定要在事務中使用!!!
<二>快取問題
i:一級快取:
session級別的快取

ii:二級快取:
SessionFactory級別快取,可以跨Session級別訪問
什麼物件應該放在二級快取?
1>經常被訪問
2>改動不大
3>數量有限
怎麼使用二級快取?
第一步:開啟二級快取。
第二步:在hibernate檔案裡面配置如下資訊:<這是使用ehcache實現>

trueorg.hibernate.cache.EhCacheProvider 第三步:新增ehcache.xml檔案
第四步:在對映類檔案中新增屬性:
預設情況下,load會使用二級快取,iterate會使用二級快取。
list會預設往二級快取新增資料,但是查詢的時候不使用。

iii:查詢快取:
是指同樣的,重複查詢使用的快取。
查詢快取依賴於二級快取,所以,需要開啟二級快取。

true 寫程式的時候,需要呼叫:Query的setCachable(true);
快取演算法:LRU,LFU,FIFO(面試意義更大,實際當中很少用到)
1.Least Recently Used
2.Least Frequently Used(命中率低)
3.First Infirst Out
memoryStoreEvictionPolicy=”LRU”(ehcache)。

<三>事務的併發處理(面試的意義更大)
併發出現的問題:
1>第一類丟失更新
2>髒讀
3>不可重複讀
4>幻讀
設定Hibernate的設定級別:
1:read-uncommitted
2:read-uncommitted
4:repeatable-read
8:serializable
設定鎖的隔離級別:

2 樂觀鎖和悲觀鎖。
一對多中,一的一方有多的一方集合,多的一方有以的一方的實體類。
一的一方配置示例:





多的一方配置檔案示例:

get和load方法:
即使載入:不管是否使用,馬上載入(從資料庫取出放入記憶體),如session.get()方法。不需要session一直開啟狀態
優點:響應速度快,效率高
缺點:佔用資源多
延遲載入:程式碼執行後並不馬上執行sql語句從資料庫獲取資料,而是在使用物件是才載入,如session.load()方法。
注意,如果使用延遲載入,session要一直 處於open狀態,否則報異常
優點:佔用資源少
缺點:響應速度慢
1:表的別名:select stu from Student as stu where stu.stuName=’yinlei’;
2:返回單個數據:當Sql語句返回的只有一個數值時,可以使用query.uniqueResult();
如:select stu from Student as stu where stuId=1;
3:模糊查詢:select stu from Student as stu where stu.stuName like ‘yinlei’;
4:select stu.stuId,stu.stuName from Student as stu返回的不是實體物件的list,而是
5:Object[]陣列list
6:命名引數類似於PreparedStatement的功能,普通佔位符,使用?,但小標中從0開始,而JDBC中從1開始
示例:
String hql = “select stu from Student as stu where stu.stuAge between ? and ?”;
Query query = session.createQuery(hql);
query.setInteger(0, 22);
query.setInteger(1, 23);
List stus = query.list();
當佔位符較多時,容易混淆,這時可以使用hibernate提供的命名引數查詢:
示例:
String hql = “select stu from Student as stu where stu.stuAge between :minAge and :maxAge and stu.stuName like :name”;
Query query = session.createQuery(hql);
query.setInteger(“minAge”, 21);
query.setInteger(“maxAge”, 23);
query.setString(“name”, “yinlei%”);
List stus = query.list();
聚合函式示例:
String hql = “select count(stu),max(stuAge),min(stuAge),avg(stuAge),sum(stuAge) from com.yinlei.Student as stu”;
Query query = session.createQuery(hql);
Object[] objs = (Object[]) query.uniqueResult();
for(Object object : objs ){
System.out.println(object);
}
Mysql分頁語法很簡單:select * from student limit (nowpage-1)*pagesize,pagesize
sqlserver分頁:select top 3 from student where stuId not in(select top 0 stuId from student order by stuId) order by stuId;
Hibernate的分頁方法:
String hql = “from Student”;
Query query = session.createQuery(hql);
query.setFirstResult((nowPage-1)*pageSize);
query.setMaxResults(pageSize);
List stus = query.list();
HQL可以執行查詢刪除修改新增操作,但是隻要刪除操作偶爾使用。
示例:
String queryString = “update Student set stuAge = stuAge+1″;
Query query = session.createQuery(queryString);
int rows = query.executeUpdate();
t.commit();
System.out.println(rows);
java的反射機制
Class
getMethods()得到本類以及父類的所有方法
getDeclaerMethods得到本類的所有方法
Method
getName()得到方法名