hibernate中懒加载的处理 (2008-12-01 14:26:52)
标签:懒加载 杂谈 分类:技术料理
hibernate中,如果在映射对象关系的时候,在一对多中(group->users)如果设置了lazy load(懒加载),那么根据group得到users时,需要特殊处理。如下:
使用查询
import net.sf.hibernate.HibernateException;import net.sf.hibernate.Session;import net.sf.hibernate.Query;import org.springframework.orm.hibernate.HibernateCallback;import org.springframework.orm.hibernate.support.HibernateDaoSupport;public class UserDAO extends HibernateDaoSupport{. . . public Group findGroupByName(String name) {return (Group) getHibernateTemplate().find("from Group g where g.name=?",name).get(0);} public Group findPopulatedGroupByName(final String name) {HibernateCallback callback = new HibernateCallback(){public Object doInHibernate(Session session) throws HibernateException, SQLException {Group group =null;String query = "from Group g where g.name=?";Query queryObject = getHibernateTemplate().createQuery(session, query);queryObject.setParameter(0, name);group = (Group) queryObject.list().get(0);group.getUsers().size();//force loadreturn group;}};return (Group) getHibernateTemplate().execute(callback);}. . . }
您可能会注意到第二个方法比第一个方法复杂得多,因为它强迫加载 users 集合。因为 Group->Users 之间的关系设置为 lazy initialize(即表 2 中 lazy="true"),组对象需要一个活跃的会话以查询用户。在定义 Group 和 Users 之间关系时设置这个属性为 lazy="false",则不需要第二个方法。在这种情况下,可能使用第一种方法 (findGroupByName) 列出组,用第二种方法(findPopulatedGroupByName)查看组细节
标签:懒加载 杂谈 分类:技术料理
hibernate中,如果在映射对象关系的时候,在一对多中(group->users)如果设置了lazy load(懒加载),那么根据group得到users时,需要特殊处理。如下:
使用查询
import net.sf.hibernate.HibernateException;import net.sf.hibernate.Session;import net.sf.hibernate.Query;import org.springframework.orm.hibernate.HibernateCallback;import org.springframework.orm.hibernate.support.HibernateDaoSupport;public class UserDAO extends HibernateDaoSupport{. . . public Group findGroupByName(String name) {return (Group) getHibernateTemplate().find("from Group g where g.name=?",name).get(0);} public Group findPopulatedGroupByName(final String name) {HibernateCallback callback = new HibernateCallback(){public Object doInHibernate(Session session) throws HibernateException, SQLException {Group group =null;String query = "from Group g where g.name=?";Query queryObject = getHibernateTemplate().createQuery(session, query);queryObject.setParameter(0, name);group = (Group) queryObject.list().get(0);group.getUsers().size();//force loadreturn group;}};return (Group) getHibernateTemplate().execute(callback);}. . . }
您可能会注意到第二个方法比第一个方法复杂得多,因为它强迫加载 users 集合。因为 Group->Users 之间的关系设置为 lazy initialize(即表 2 中 lazy="true"),组对象需要一个活跃的会话以查询用户。在定义 Group 和 Users 之间关系时设置这个属性为 lazy="false",则不需要第二个方法。在这种情况下,可能使用第一种方法 (findGroupByName) 列出组,用第二种方法(findPopulatedGroupByName)查看组细节