1:hibernate的懶載入(通過asm和cglib包實現)代理對象實現
2:單個對象的查詢
總之對於get和load的根本區別,一句話,hibernate對於load方法認為該資料在資料庫中一定存在,可以放心的使用代理來消極式載入,如果在使用過程中發現了問題,只能拋異常;
而對於get方法,hibernate一定要擷取到真實的資料,否則返回null。get()方法與load()方法的區別就在於不會尋找二級緩衝。
一般像在給另外一個對象設定關係時採用load方法擷取對象
返回對象後session關閉再訪問對象,會報無法初始化代理.可以通過反射查看類名(返回的是個代理對象)[下面的懶載入相同]
解決辦法:通過hibernate.initialize(對象)初始化或者訪問對象的屬性;
3:一對一(對系統效能的提高影響不是很大)
hibernate預設情況下查詢主對象不採用懶載入.
查詢從對象時採用懶載入.(constrained等於"true" lazy等於"proxy(預設)/false/true" fetch等於"select(預設)【通過兩次select查詢,效率沒有join高】/join")
fetch的配置如果為join,lazy會無效了.
4:一對多跟多對多
資料庫查詢的開銷跟網路傳輸的開銷
lazy跟fetch同上(預設就是懶載入)
5:懶載入時訪問它的ID和Class不會去訪問資料庫,因為ID在另外一個對象中已經有了,呵呵
6:對屬性的懶載入[比較麻煩,需要等編譯後再修改,一般對大欄位可能需要處理]
7:query的iterate方法(N+1問題)
工作原理如下:先取得所有的ID,然後根據ID從緩衝中去讀取
一級緩衝跟二級緩衝都找不到時,查資料庫。【如果有10條記錄,那麼查詢資料庫就會執行11次,其中一次是查ID】
如果不能保證緩衝中有資料,iterate方法效率比較低
8:Criteria(條件查詢) 和 DetachedCriteria(離線條件查詢)
session.createCriteria(User.class)
----------------
DetachedCriteria query = DetachedCriteria.forClass(User.class);
query.getExecutableCriteria(session);
9:Native查詢
Query query s.createQuery(from 對象名稱);
10:Query q s.createSQLQuery("select * from 表名")
q.list();
查出來的是Object數組
解決:
Query q s.createSQLQuery("select * from 表名").addEntity(User.alss);取得的為對象