关于Hibernate的问题,lazy=true和proxy

来源:互联网 发布:mac怎么取消开机启动 编辑:程序博客网 时间:2024/04/29 16:23

lazy="true"是用来指定一个collection延迟载入的,和proxy没关系。Top

2 楼lyo(一个人的路上)回复于 2003-11-29 13:57:58 得分 0

那就是说只要在配置文件中写上   lazy=true就可以了,在自己的程序中不用特殊编写。  
  但是proxy是怎麽回事?它是做什莫用的?困惑我很久了   :(Top

3 楼miwoo(我的自行车被偷了:()回复于 2003-11-29 19:16:04 得分 50

>那就是说只要在配置文件中写上   lazy=true就可以了,在自己的程序中不用特殊编写。<  
  对,但只有collection有lazy这个属性,你可以看看dtd。  
   
   
  >但是proxy是怎麽回事?它是做什莫用的?困惑我很久了   :(<  
  比如说User和Group是many-to-one的关系,User中有一个类型为Group的属性group,  
  若你想要载入一个User时,它的Group属性group要延迟载入,  
   
  A   那你就必须为Group类定义proxy,这个proxy一般可以定义为两种  
      1   Group类本身  
      2   一个被Group类实现的,且包含了Group类的所有业务方法的接口,这种做法可以克服第一种做法的一些缺点,但会比较麻烦,因为要定义一个接口嘛。  
   
  B   映射文件中这个<many-to-one>的outer-join要定义为  
      1   "false"(如果你在hibernate.properties或hibernate.cfg.xml文件中定义了hibernate.use_outer_join   true)  
      2   "auto"(默认的)或"false"(hibernate.use_outer_join   false),(我没有试过当hibernate.use_outer_join   false时,<many-to-one>的outer-join定义为"true",会不会延迟载入和还是会用outer   join一并取出关联对象(在这里就是group对象),你可以试试)  
   
  hibernate中proxy是用cglib生成的动态代理,你可以看看相应的原码。再仔细看看文档加上实践,应该不难弄懂的:)  
  Top

4 楼miwoo(我的自行车被偷了:()回复于 2003-11-29 19:24:06 得分 0

AB两点都要才能达到lazy效果Top

5 楼lyo(一个人的路上)回复于 2003-11-30 11:50:58 得分 0

多谢你精彩的讲解!