lazy策略可以使用在:
* <class>標簽上,可以取值:true/false
* <property>標簽上,可以取值:true/false需要類增強工具
* <set><list>標簽上,可以取值:true/false/extra
* <one-to-one><many-to-one>單端關聯上,可以取值:false/proxy/noproxy
lazy概念:只有真正使用該對象時,才會創建,對于hibernate而言,正真使用時才會發出sql
注意:hibernate支持lazy策略只有在session打開關態下有效
<class>標簽上的lazy特性只對普通屬性起作用,不會影響到集合上的lazy特性
<class>標簽上的lazy特性只對普通屬性起作用,不會影響到單端關聯上的lazy特性
在jsp中使用OpenSessionInview模式,一般采用filter實現
lazy策略在<class>上
//設置<class>標簽上的lazy="true",也就是默認配置

public void testload1()
{
Session session=null;

try
{
session=HibernateUtils.getSession();
session.beginTransaction();
//不會發sql
Group g=(Group)session.load(Group.class, 1);
//不會發sql
System.out.println(g.getId());
//會發sql
System.out.println(g.getName());
session.getTransaction().commit();

}catch(Exception e)
{
e.printStackTrace();
session.getTransaction().rollback();

}finally
{
HibernateUtils.closeSession(session);
}
}

public void testload2()
{
Session session=null;
Group g=null;

try
{
session=HibernateUtils.getSession();
session.beginTransaction();
//不會發sql
g=(Group)session.load(Group.class, 1);
//不會發sql
session.getTransaction().commit();

}catch(Exception e)
{
e.printStackTrace();
session.getTransaction().rollback();

}finally
{
HibernateUtils.closeSession(session);
}
//不能正確輸出,拋出lazy初始化lazyInitializationException異常,因為session已經關閉
//hibernate支持lazy策略只有在session打開關態下有效
System.out.println(g.getName());
}
lazy策略在<set><list>上
<class>標簽上的lazy特性只對普通屬性起作用,不會影響到集合上的lazy特性
//保持lazy是默認配置

public void testLoad1()
{
Session session=null;

try
{
session=HibernateUtils.getSession();
session.beginTransaction();
//不會發出sql
Classes classes=(Classes)session.load(Classes.class, 3);
//會發出sql
System.out.println(classes.getName());
//不會發出sql
Set students=classes.getStudents();
//會發出sql,發出查詢全部數據的sql
System.out.println(students.size());
session.getTransaction().commit();

}catch(Exception e)
{
session.getTransaction().rollback();
e.printStackTrace();

}finally
{
HibernateUtils.closeSession(session);
}
}
//設置<class>標簽上的lazy="false"

public void testLoad1()
{
Session session=null;

try
{
session=HibernateUtils.getSession();
session.beginTransaction();
//會發出sql
Classes classes=(Classes)session.load(Classes.class, 3);
//不會發出sql
System.out.println(classes.getName());
//不會發出sql,不會影響集合
Set students=classes.getStudents();
//會發出sql,發出查詢全部數據的sql
System.out.println(students.size());
session.getTransaction().commit();

}catch(Exception e)
{
session.getTransaction().rollback();
e.printStackTrace();

}finally
{
HibernateUtils.closeSession(session);
}
}
//設置集合上的lazy="false",其他全為默認

public void testLoad1()
{
Session session=null;

try
{
session=HibernateUtils.getSession();
session.beginTransaction();
//不會發出sql
Classes classes=(Classes)session.load(Classes.class, 3);
//會發出sql,會發出兩條sql分別加載classes和Student
System.out.println(classes.getName());
//不會發出sql
Set students=classes.getStudents();
//不會發出sql
System.out.println(students.size());
session.getTransaction().commit();

}catch(Exception e)
{
session.getTransaction().rollback();
e.printStackTrace();

}finally
{
HibernateUtils.closeSession(session);
}
}
//設置集合上的lazy="extra",其他全為默認(比智能,基本與lazy="true"相同)

public void testLoad1()
{
Session session=null;

try
{
session=HibernateUtils.getSession();
session.beginTransaction();
//不會發出sql
Classes classes=(Classes)session.load(Classes.class, 3);
//會發出sql
System.out.println(classes.getName());
//不會發出sql
Set students=classes.getStudents();
//會發出sql,發出一條比較智能的sql
System.out.println(students.size());
session.getTransaction().commit();

}catch(Exception e)
{
session.getTransaction().rollback();
e.printStackTrace();

}finally
{
HibernateUtils.closeSession(session);
}
}
lazy策略在<one-to-one><many-to-one>單端關聯上
可以取值:false/proxy/noproxy,默認為proxy,noproxy為不用代理,使用自解碼,要使用增強工具
//所有lazy全為默認

public void testload1()
{
Session session=null;

try
{
session=HibernateUtils.getSession();
session.beginTransaction();
//不會發出sql
User user=(User)session.load(User.class, 3);
//會發出sql
System.out.println(user.getName());
//不會發出sql
Group group=user.getGroup();
//會發出sql
System.out.println(group.getName());
session.getTransaction().commit();

}catch(Exception e)
{
e.printStackTrace();
session.getTransaction().rollback();

}finally
{
HibernateUtils.closeSession(session);
}
}
//設置<many-to-one>的lazy="false",其他全為默認,效果同集合

public void testload1()
{
Session session=null;

try
{
session=HibernateUtils.getSession();
session.beginTransaction();
//不會發出sql
User user=(User)session.load(User.class, 3);
//會發出sql,會發出兩條sql分別加載Group和User
System.out.println(user.getName());
//不會發出sql
Group group=user.getGroup();
//不會發出sql
System.out.println(group.getName());
session.getTransaction().commit();

}catch(Exception e)
{
e.printStackTrace();
session.getTransaction().rollback();

}finally
{
HibernateUtils.closeSession(session);
}
}
//設置<class>標簽上的lazy="false",其他全默認,效果同集合
<class>標簽上的lazy特性只對普通屬性起作用,不會影響到<many-to-one>的lazy特性

public void testload1()
{
Session session=null;

try
{
session=HibernateUtils.getSession();
session.beginTransaction();
//會發出sql
User user=(User)session.load(User.class, 3);
//不會發出sql
System.out.println(user.getName());
//不會發出sql,不會影響到<many-to-one>
Group group=user.getGroup();
//會發出sql
System.out.println(group.getName());
session.getTransaction().commit();

}catch(Exception e)
{
e.printStackTrace();
session.getTransaction().rollback();

}finally
{
HibernateUtils.closeSession(session);
}
}
posted on 2009-11-03 16:33
junly 閱讀(532)
評論(0) 編輯 收藏 所屬分類:
hibernate/orm