一种配置情况是:<convert converter="bean" match="com.hengyu.bean.project.*" />
大家都知道,当hibernate里面配置上lazy="true"时,查询对象A时,不会去查询于A相关联的B、C、D等对象,只要取B、C、D中属性值时,才会去查询。但是hibernate配合DWR时,这个lazy属性好象不起作用,只要一查询,就会把于之相关联的属性全部加载,执行一个方法,竟然有上百条HQL语句,使效率极其低下。
另一种配置是:<convert converter="hibernate3" match="com.hengyu.bean.project.*" />这样的话效率很快,但是当我去于A相关联的B、C等表里的属性时,却取不到。配置了opensessioninview,其他表中的属性仍然取不到。郁闷了半月了,请高手指教。 web.xml
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filterclass>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>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

解决方案 »

  1.   

    是不是 hibernate的延迟加载只能在应用服务器端有效,但dwr往往要到浏览器端才会去读取值对象的属性,因此再也不可能延迟加载了?期待高手的回答!
      

  2.   

    以前用dwr的时候好像没有发现这个问题
    像下面这样,把每个bean的需要显示的字段都自己定义出来,看一下还会不会有那么多sql,
    我觉得可能是dwr把你的bean的每个属性都get了,包括延迟加载的Set,不过只是猜测,没有试过
    <convert match="xxx.domain.GoodsType" converter="bean">
         <param name="include" value="id,typeName"/>
    </convert>
    <convert match="xxx.domain.Goods" converter="bean">
         <param name="include" value="id,typeName"/>
    </convert>
    .....
      

  3.   

    客户端:
    DWR调用方法
    服务器端:
    service某类中处理相关方法--->dao中执行数据库操作。
    就是说dao层中的方法有出入,和DWR没有关系。
    你单独执行一下dao层中的方法,看看是否也出现这样的错误。
      

  4.   

    我提下建议。我那时做过 DWR + hibernate 进行页面分页显示的功能,那时我引进了一种VO对象。不知楼主是不是也是做查询,如果是的话,则先把要显示的内容封装到VO对象中,在DWR中就只是convert VO对象了
      

  5.   

    怎么无关了,dwr要把返回的bean转换为js里的json对象,这样就需要取bean的属性值,就要调用getter,当调用延迟加载属性的getter,就会发出sql
      

  6.   


    如果是convert Vo的话,肯定没有问题
      

  7.   

    我googel了一下
    发现一个帖子
    --------------------------------
    所有的源码基本上就是这些,我使用单元测试时,lazy效果已经有了!但是我访问页面,通过dwr调用service层方法,好像却失效了,通查询查看hibernate日志,看到与之相关的所有select语句,全部打印了出来!
    -------------------
    找到原因了,我在convter的时候,param没有做"include",这样所有属性都为白名单,我做了限制后,问题解决!! 
    ----------------------------------------------
      

  8.   

    会不会是hibernate的延迟加载只能在应用服务器端有效,但dwr往往要到浏览器端才会去读取值对象的属性,因此再也不可能延迟加载了? 
      

  9.   

    把需要的属性 include 吗?
      

  10.   

    但是当我去于A相关联的B、C等表里的属性时,却取不到是用js取json对象吗?那样肯定取不到了。你改成converter="hibernate3"后,延迟加载的属性都没有取,封装成的json对象里自然也就没有这些延迟加载的属性
      

  11.   

    你取得是js里的对象,你觉得js的对象也像hibernate的bean那样实现了动态代理吗?,你取js对象属性的时候,根本就没有和服务端交互啊
      

  12.   

    假设你第一次dwr查询的是国家的列表,当你选择一个国家时,你想直接通过 国家.城市 来获取城市列表,但是之前在加载国家的时候,根本没有加载城市,所以你现在取不到,你需要在选择国家的时候再次调用一次dwr的方法来根据你选择的国家来返回城市列表,从而实现联动
      

  13.   

    我在后台中去取A中的B,A.getB().getName();然后打印出来,没有错误,数据获取正常。 可以肯定opensessioninview几经起效,而且,这个时候到页面中也是可以获取到A.getB().getName();的值,所以,萌发了一个想法,先把程序要用的属性到后台先加载一下,然后,到浏览器中就可以取得了,不知道是否可行?
      

  14.   

    你配置了openSessionInView,后台即使不取一下,也可以在jsp里
    <%= A.getB().getName();%>
    你这里的取法是在jsp内嵌java代码,jsp编译成servlet后,执行这一段java代码的时候,这个时候的session还没有关闭你前面说的通过dwr取不到,是在请求结束后,js对象的属性取不到,和这个不是一回事
      

  15.   

    其实这样<convert converter="hibernate" match="com.hengyu.bean.project.*" >
     <param name="include" value="id,typeName"/> 
     </convert> 就可以了