论坛首页 Web前端技术论坛

使用DWR,hibernate的annotation的lazy属性失效,为何?

浏览 4855 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-08-23  
我先说用了几个框架吧,spring,hibernate,dwr,然后bean用的是annotation标记的:
其中商品和订单表,我用的是一对多
Product bean
  1. @OneToMany(targetEntity = Order.class, cascade = CascadeType.REMOVE, fetch = FetchType.LAZY)   
  2.     @JoinColumn(name = "PRODUCTID")   
  3.     public List<Order> getOrders() {   
  4.         return orders;   
  5.     }  


在DAO层里,我用了spring的hibernateDaoSupport,其中有个分页查询方法:

java 代码
  1. /**  
  2.  * 根据页码和每页的长度返回对象集合  
  3.  *   
  4.  * @param pageNo  
  5.  *            页码  
  6.  * @param pageSize  
  7.  *            每页的长度  
  8.  * @return  
  9.  */    
  10. public Page<T> PageQuery(int pageNo,int pageSize){   
  11.     Criteria criteria = this.createCriteria();   
  12.     return this.pagedQuery(criteria, pageNo, pageSize);   
  13. }  

方法返回的page,我自己定义的一个封装了页面属性和内容的bean。

然后定义了一个service层的方法,调用DAO层的这个分页函数。

java 代码

 

  1. public List<Product> getProducts(int pageNo,int pageSize){         
  2.         return productDAO.PageQuery(pageNo, pageSize).getResult();   
  3.     }  

 JSP页面使用DWR调用service层的getProducts

xml 代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr//dwr20.dtd">  
  3. <dwr>  
  4.     <allow>  
  5.         <create javascript="ProductService" creator="spring">  
  6.             <param name="beanName" value="productService"></param>  
  7.             <include method="loadProduct" />  
  8.             <include method="getProducts" />  
  9.         </create>  
  10.     </allow>  
  11. </dwr>  

再定义了JS函数

js 代码
  1. window.onload = function(){   
  2.     ProductService.getProducts(1,10,displayProducts);   
  3. }   
  4. function displayProducts(products){   
  5.     DWRUtil.removeAllRows("items");   
  6.     if (items.length == 0) {   
  7.         alert("No matching products found");   
  8.         $("products").style.visibility = "hidden";   
  9.     } else {   
  10.         DWRUtil.addRows("items",products,cellFunctions);   
  11.         $("products").style.visibility = "visible";   
  12.     }   
  13.        
  14. }   
  15. /*  
  16.  * Array of functions to populate a row of the items table  
  17.  * using DWRUtil's addRows function  
  18.  */  
  19. var cellFunctions =[   
  20.     function(product){return product.productname},   
  21.     function(product){return product.productdetail},   
  22.     function(product){return product.price},   
  23.     function(product) {    
  24.     var btn = document.createElement("button");   
  25.     btn.innerHTML = "Add to cart";   
  26.     btn.productId = product.id;   
  27.     btn.onclick = addToCartButtonHandler;   
  28.     return btn;   
  29.   }   
  30. ];  
所有的源码基本上就是这些,我使用单元测试时,lazy效果已经有了!但是我访问页面,通过dwr调用service层方法,好像却失效了,通查询查看hibernate日志,看到与之相关的所有select语句,全部打印了出来!
   发表时间:2007-08-24  
web.xml里面加Open Session In View Filter了吗?URL-Mapping设置:/dwr/*
0 请登录后投票
   发表时间:2007-08-24  
cats_tiger 写道
web.xml里面加Open Session In View Filter了吗?URL-Mapping设置:/dwr/*

原来就已经设置了,URL-Mapping设置:/*,改成你的设置,问题依旧
0 请登录后投票
   发表时间:2007-08-24  
cats_tiger 写道
web.xml里面加Open Session In View Filter了吗?URL-Mapping设置:/dwr/*


原来的URL-Mapping设置:/*,改成你的设置,问题依旧
0 请登录后投票
   发表时间:2007-08-24  
你有没有在dwr.xml中为Product和Order加converter?前面贴的代码好像没有。
提个建议,java代码中return之前最好把每个bean都evict一下或者转换为Map,可以写一个通用的转换函数或用beanUtils。如果不这样处理,由于打开着session,DWR会迫使Hibernate把能加载的数据都加载,尤其是在关联关系多的时候。
0 请登录后投票
   发表时间:2007-08-27  
找到原因了,我在convter的时候,param没有做"include",这样所有属性都为白名单,我做了限制后,问题解决!!
0 请登录后投票
   发表时间:2008-05-05  
能说一下怎么限制呢!
<create creator="spring" javascript="AjaxEmpService">
<param name="beanName" value="AjaxEmpService" />
<include method="sub_deploy" />
<include method="findEmp"/>
</create>
我这里也写了,可他还是会把子表里的全抓出来,能说一下你是怎么配的吗
0 请登录后投票
   发表时间:2008-05-05  
知道了,原来是我<convert converter="bean" match="edu.erp.emp.bean.EmpBO" />这个配置有问题 ,要改成<convert converter="hibernate3" match="edu.erp.emp.bean.EmpBO" />
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics