困扰我几天的一个延迟加载问题

zhaoweianan 2008-09-12 01:32:20
<!--初始化WebApplicationContext-->
<context-param>
<param-name>contextConfigLocation </param-name>
<param-value>/WEB-INF/classes/applicationContext.xml </param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener </listener-class>
</listener>
<!--open session in view -->
<filter>
<filter-name>hibernateFilter </filter-name>
<filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </filter-class>
<init-param>
<param-name>singleSession </param-name>
<param-value>true </param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>hibernateFilter </filter-name>
<url-pattern>*.jsp </url-pattern>
</filter-mapping>

调用代码User与Message是一对多的关系
public Users queryUsers(final int id){
return (Users)getHibernateTemplate().execute(new HibernateCallback() {

public Object doInHibernate(Session session)
throws HibernateException, SQLException {

String hql = "from Users where id=:id ";
Query query = session.createQuery(hql);
query.setInteger("id",id);
List <Users> list = query.list();
return list.get(0);
}
});
}
public class UserAction extends Action {

private TestDao testDao;

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {

Users user = testDao.queryUsers(1);
System.out.println(user.getMessages().size());
return mapping.findForward("ok");
}
}

执行代码抱错...Session is closed...
求高手帮忙解决呀,困扰我很多天了
...全文
144 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gongyali2005 2008-09-17
  • 打赏
  • 举报
回复
我在网上看到一例子.
他写了一个过滤器,把HIBERNATE SESSION 放到SEVERLET SESSION中,来延长工HIBERNATE SESSION的生命周期.
Landor2004 2008-09-17
  • 打赏
  • 举报
回复
既然配置了openSessionInView那就没有问题,只是你的过滤url有问题


<url-pattern>*.jsp </url-pattern>
</filter-mapping>
改成
<url-pattern>*.do </url-pattern>
</filter-mapping>
dm520 2008-09-16
  • 打赏
  • 举报
回复
lazy=false

我一般就是这样就好了 ,
jiedamu 2008-09-14
  • 打赏
  • 举报
回复
-----解决延迟加载的二个最好途径
1:修改配制文件一方面的<set... 结点 /> 加一个 lazy="false" 这种办法对程序不太灵活
2:强制加载
下面采用第二种强制加载方案:
调用代码User与Message是一对多的关系
public Users queryUsers(final int id){
return (Users)getHibernateTemplate().execute(new HibernateCallback() {

public Object doInHibernate(Session session)
throws HibernateException, SQLException {

String hql = "from Users where id=:id ";
Query query = session.createQuery(hql);
query.setInteger("id",id);
List <Users> list = query.list();


for(Users u:list){
Hibernate.initialize(Users.getMessages());//Users.getMessages() 这要根据你的user类Set属性有关
}


return list.get(0);
}
});
}
zhaoweianan 2008-09-12
  • 打赏
  • 举报
回复
其实配置open session in view 能解决这个问题,但是我一直没配起,十分郁闷.麻烦各位帮我检查检查,万分感激。
wangyi123 2008-09-12
  • 打赏
  • 举报
回复
学习,帮顶
老紫竹 2008-09-12
  • 打赏
  • 举报
回复
1 不要在session里面使用lazy加载的东西
2 如果必须用,那就在sessoin虚假的调用一下,这样lazy的数据就会被真实读取了,不过挺搞笑的,还是去掉lazy更好吧!

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧