Hibernate lazy策略可以使用在(hibernate3.0預設為true):
* <class>標籤上,可以取值:true/false
只會影響到類的普通屬性,即使設定為false,類中的集合屬性預設情況下仍然採用延時載入
* <property>標籤上,可以取值:true/false
需要類增強工具,通過改變位元組碼來實現,屬性的延時載入,常用於clob和blob大對象的延時載入
* <set><list>標籤上,可以取值:true/false/extra
* <one-to-one><many-to-one>單端關聯上,可以取值:false/proxy/noproxy
lazy概念:只有真正使用該對象時,才會建立,對於hibernate而言,真正使用的時候才會發出sql
hibernate支援lazy策略只有在session開啟狀態下有效(OpenSessionInView)
測試案例:
1:
public void testLoad() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
//不會發出sql
Group group = (Group)session.load(Group.class, 1);
//不會發出sql
System.out.println("group.id=" + group.getId());
//會發出sql
System.out.println("group.name=" + group.getName());
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
2.
public void testLoad() {
Session session = null;
Group group = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
group = (Group)session.load(Group.class, 1);
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
//不能正確輸出,拋出LazyInitializationException 異常,因為session已經關閉
//hibernate支援lazy策略只有在session開啟狀態下有效
//openSessionInView
System.out.println("group.name=" + group.getName());
}
3.(Classes和Student的定義見多對多關聯映射)
public void testLoad() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
//不會發出sql
Classes classes = (Classes)session.load(Classes.class, 1);
//會發出sql
System.out.println("classes.name=" + classes.getName());
//不會發出sql,賦值一個persistentSet的代理對象
Set students = classes.getStudents();
//會發出sql
for (Iterator iter=students.iterator(); iter.hasNext();) {
Student student = (Student)iter.next();
System.out.println("student.name=" + student.getName());
}
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}