请教open session in view

刚刚接触Spring,我想做个练习,但总出错; struts1.1 + hibernate3+spring1.2.1+Tomcat5 我想使用open session in view模式 hibernate中以设置成lazy="true"。 抱错:session 以关闭 配置如下

web.xml ?xml version="1.0" encoding="UTF-8"? !DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" web-app display-name wish /display-name context-param param-name contextConfigLocation /param-name param-value /WEB-INF/applicationContext.xml /param-value /context-param 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 false /param-value /init-param /filter filter-mapping filter-name hibernateFilter /filter-name url-pattern *.do /url-pattern /filter-mapping listener listener-class org.springframework.web.context.ContextLoaderListener /listener-class /listener servlet servlet-name action /servlet-name servlet-class org.apache.struts.action.ActionServlet /servlet-class init-param param-name config /param-name param-value /WEB-INF/struts-config.xml /param-value /init-param init-param param-name debug /param-name param-value 2 /param-value /init-param init-param param-name application /param-name param-value ApplicationResources /param-value /init-param load-on-startup 2 /load-on-startup /servlet servlet-mapping servlet-name action /servlet-name url-pattern *.do /url-pattern /servlet-mapping ......................... ........................... /web-app

struts-config.xml如下 ?xml version="1.0" encoding="UTF-8"? !DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"

"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd" struts-config form-beans form-bean name="lazyForm" type="sixhero.actionForm.LazyForm" / /form-beans action-mappings action name="lazyForm" path="/test/lazyAction" scope="request"

type="org.springframework.web.struts.DelegatingActionProxy" forward name="ok" path="/test/ok.jsp" / forward name="no" path="/test/no.jsp" / /action /action-mappings message-resources parameter="ApplicationResources" / plug-in className="org.springframework.web.struts.ContextLoaderPlugIn" set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" / /plug-in

/struts-config

ok.jsp如下

%@ page contentType="text/html; charset=GB2312" % %@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" % %@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" % %@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" % %@ taglib uri="/WEB-INF/struts-nested.tld" prefix="nested" % %@ taglib uri="/WEB-INF/struts-template.tld" prefix="template" % %@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" % html head title ok /title /head body bgcolor="#ffffff"

logic:notEmpty name="list" logic:iterate id="temp" name="list" bean:write name="temp" property="UserName"/ br bean:write name="temp" property="forumDescript"/ br

br bean:write name="temp" property="Order.name" filter="true"/ br br

/logic:iterate

/logic:notEmpty /body /html

Order.name总是抱错

是小写的order.name

谢谢您的回答:我试了.我哪个关连字段是Order

struts能不能用open session in view,是不是只有用spring mvc才能用.struts中应该怎么用?或哪里有相关的例子.

open session in view是你必须做一种过滤器,一直保持Hibernate的session打开,这和Spring有什么关系?Spring是个可有可无的东西,只不过它开发很多方便的API。

在struts中,Jsp中的order的意思不是你的关联字段,而是相应的getOrder方法,将get去除,O变成小写,所以无论你的字段是大小写,反正Jsp中order是小写,试试一下就知道了。

org.springframework.orm.hibernate3.support.OpenSessionInViewFilter 这个类是否就是Filter,直接用可不可以。

直接用可以: http://www.jroller.com/page/cardsharp?entry=open_session_in_view_pattern

Open session in view是Hibernate中很丑陋的东西,对于Open session in view解决方案,Jdon框架是采取ID集合查询的方式,这样在需要时根据ID再查询数据库,而不是为了以后获取保持数据库一直打开,有性能陷阱。

亏得Gavin King想得出来,还把它上升为模式,自说自话妄图铁板钉钉,这种模式实际是反模式的。不多谈...

我知道是po与vo的问题,网上也有类似的讨论。我只是现做一做,看能不能实现。

您能告诉我struts+hibernate+spring中可不可以实现,若可以我会试着做。但今后不会采用该方法解决问题。 很高兴与您讨论问题。

任何稀奇古怪的方案都是可以实现的。 我觉得你的问题有些主次不分,open session in view是hibernate为掩饰自己的设计缺点而提出的一个修补方案,它怎么能成为一个整体架构追求实现的目标呢?

Struts等MVC模式框架都是透明的,基于Jsp/Web技术,只要符合J2EE标准的技术有什么不可以实现的呢?

明白了 open session in view 只是hibernate为在view层打开的一种连接的实现.与strus无关. 这个问题不占您的时间了. end

open session in view 不是一直保持Hibernate的session打开,而是保持它在一个request/response cycle中打开,比较常见的应用情况是在编辑页面点击保存按钮后,先执行一个保存的SERVLET,后通过FORWORD显示保存后的信息。利用过滤器让显示的内容全部读入内存后再COMMIT这个TRANSACTION,这样就可以避免在JSP里面读到某个对象的LAZY LOADING的关联对象时候出现LazyInitializationException: Session has been closed 之类的信息。 GAVIN 绝不会傻到将CONNECTION一直打开的地步。 而SPRING里提供了较简便的方法来实现这个PATTERN. 当然不用SPRING也可以实现啦 这当然是一个模式,在某些情况下很有用。虽然不是在所有情况下都适合。但每个模式都有其适合和不适合的地方吧。 banq 连自己都不清楚就来说有点太不厚道了吧

>open session in view 不是一直保持Hibernate的session打开 这个问题已经在其他帖子校正,这个session不是httpSession的意思,而是request生命周期,在这个周期中一直打开着,因为一个request周期中,经过表现层 业务层 持久层三个环节,层层环节相套,Exception等抛出出现之后,处理更加复杂。

对不起,那是我误解您的意思了,我只是觉得您这么说GAVIN有点不太公平,HIBERNATE还是很不错的