环境:struts 1.2, hibernate 3.1,spring 2.0, dwr 2.0俩张表:category(类别表,延迟加载product) product(产品表), 一对多的关系(hibernate配置在下面贴出)没事的时候练了下手,使用dwr动态向表格添加了行,成功了,数据都能正常显示,但无意切到myeclipse的打印台,看到了很多SQL语句,一句查询category,然后N举根据category查询product的语句(这是N+1吧?)在页面上我并没有使用相关product的成员(意味着没有对catagory下的product集合里的对象初始吧?)我不懂的就是为什么加了spring的openSessionInViewFilter之后就是这样,用servlet的filter过滤器不会出现这种情况有人帮忙理解下其中的道吗?相关配置:
category映射<hibernate-mapping>
    <class name="com.entity.TCategory" table="T_CATEGORY" schema="MYTEST">
        <id name="cateid" type="java.lang.Long">
            <column name="CATEID" precision="22" scale="0" />
            <generator class="sequence">
             <param name="sequence">sq_cate</param>
            </generator>
        </id>
        <property name="catename" type="java.lang.String">
            <column name="CATENAME" length="20" not-null="true" />
        </property>
        <set name="pros" table="T_PRODUCT" lazy="true" cascade="all" inverse="true">
         <key column="CATEID"></key>
         <one-to-many class="com.entity.TProduct"/>
        </set>
    </class>
</hibernate-mapping>
product映射<hibernate-mapping>
    <class name="com.entity.TProduct" table="T_PRODUCT" schema="MYTEST">
        <id name="proid" type="java.lang.Long">
            <column name="PROID" precision="22" scale="0" />
            <generator class="sequence">
             <param name="sequence">sq_pro</param>
            </generator>
        </id>
        <property name="proname" type="java.lang.String">
            <column name="PRONAME" length="20" not-null="true" />
        </property>
        <property name="proprice" type="java.lang.Long">
            <column name="PROPRICE" precision="22" scale="0" not-null="true" />
        </property>
        <many-to-one name="cate" class="com.entity.TCategory" column="CATEID" ></many-to-one>
    </class>
</hibernate-mapping>
web.xml过滤器的配置<filter>
   <filter-name>openSessionInView</filter-name>
   <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
  </filter>
  <filter-mapping>
   <filter-name>openSessionInView</filter-name>
   <url-pattern>*.do</url-pattern>
  </filter-mapping>
  <filter-mapping>
   <filter-name>openSessionInView</filter-name>
   <url-pattern>/dwr/*</url-pattern>
  </filter-mapping>
页面:<html> 
<head>
<title>JSP for AddCateForm form</title>
<script type="text/javascript" src="/testssha/dwr/engine.js"></script>
<script type="text/javascript" src="/testssha/dwr/util.js"></script>
<script type="text/javascript" src="/testssha/dwr/interface/cateShow.js"></script>
<script type="text/javascript">
function showCate(){
cateShow.findAll(function(data){
DWRUtil.addRows("showCateTable",data,[function(data){return data.cateid},
  function(data){return data.catename}]);
});
}
</script>

</head>
<body>
<html:form action="/addCate">
catename : <html:text property="catename"/><html:errors property="catename"/><br/>
<html:submit/><html:cancel/>
</html:form>
<a href="javascript:showCate()">显示所有</a><br>
<table width="50%">
<tbody id="showCateTable"></tbody>
</table>
</body>
</html>

解决方案 »

  1.   

    因为你可能设置成 Lazy 了。我一般不建议使用 OpenSessionInView 模式。原因详见这个帖子 4、5 楼:

    http://topic.csdn.net/u/20100907/22/dc9a3777-0cc5-45da-a55f-36ebcc828223.html
      

  2.   


    设置lazy为false不正是要求他延迟加载吗?
      

  3.   


    你在“EJB3在SessionBean外部调用实体中外键的Get方法时抛出LazyInitializationException异常”贴中回复的重点是在于性能方面,我想在想知道的是spring的openSessionInView这个filter 和 servlet的filter有什么区别?上述现象我是认为spring破坏了hibernate的延迟加载这一机制,spring的设计者不至于这样吧?