標籤:catch exce comm move close 過程 void bean eager
一、什麼是消極式載入
為了節省Hibernate載入對象的效能節銷,在Hibernate中真正需要用到這個對象時,才會發出
SQL語句來抓取這個對象。這一個過程稱為消極式載入。
二、消極式載入的分類
A:實體物件的消極式載入
B:一對多|多對多的消極式載入
C:多對一|一對一的消極式載入
D:屬性的消極式載入
- A:實體物件的消極式載入:使用session.get()和session.load()擷取對象的區別就是是否開啟消極式載入。
Hibernate只載入實體物件的ID,需要其他屬性,才真正的發出SQL來載入這個對象。
Load:採用消極式載入 載入到的是一個代理對象
Get:沒有採用消極式載入 載入到的是一個實體物件。
User user=(User)session.load(clazz, id);//直接返回的是代理對象
System.out.println(user.getId());//沒有發送sql語句到資料庫載入
user.getName();//建立真實的User執行個體,並發送sql語句到資料庫中
- 注意:1.不能判斷User=null;代理對象不可能為空白
2.代理對象的限制:和代理關聯的session對象,如果session關閉後訪問代理則拋異常。session關閉之前訪問資料庫
fetch = FetchType.Lazy:表示開啟消極式載入。讀取班級時,不會發出讀取學生的SQL語句。等真正使用學生資料時,才會發出一條SQL語句讀取學生
fetch = FetchType.EAGER:取消延遲加裁。讀取班級會左關聯讀取學生。
@OneToMany(cascade = { CascadeType.REMOVE },fetch=FetchType.EAGER)
@JoinColumn(name = "classes_id")
@OrderBy(value = " studentID desc")
public List<StudentBean> getStuList() {
return stuList;
}
- C : 多對一|一對一的延遲加裁 預設是取消消極式載入的。
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "group_id")
private GroupBean groupBean;
- 消極式載入帶來的問題: session關閉之後,再訪問代理對象(消極式載入擷取的是代理對象)會拋出“no session”異常。
package action;import java.util.Set;import javassist.compiler.ast.IntConst;import org.hibernate.Session;import org.hibernate.Transaction;import bean.ClassBean;import bean.StudentBean;import util.HibernateSessionUtil;public class Test { public static void main(String[] args) { ClassBean cla=Test.load(); //當Test.load()執行完畢之後,session就被關閉,這時候再訪問代理對象則會拋出異常。 使用session。get就不會出現這個問題 System.out.println(cla.getClassName()); } private static ClassBean load() { ClassBean cla = null; Session session = null; Transaction tran = null; try { session = HibernateSessionUtil.getSession(); tran = session.beginTransaction(); cla = (ClassBean) session.load(ClassBean.class, new Integer(2)); //使用消極式載入,獲得的是代理對象 tran.commit(); return cla; } catch (Exception e) { e.printStackTrace(); tran.rollback(); } finally { HibernateSessionUtil.closeSession(); //關閉session } return null; }}
- 橙色字型處代碼會出現“no session”異常。
(十六)Hibernate中的消極式載入