举个例子吧:
Child <- many-to-one ->Parentclass Child {
  private Parent parent;  public Parent getParent (){
    return this.parent;//访问了实例变量
  }
  
}class Parent {
  private String name;  public String getName(){
    return this.name;//访问了实例变量
  }  public void f(){
    System.out.println("invokeing f()");//没有访问实例变量
  }
}如果 many-to-one 的lazy设为proxy,当child.getParent().getName()或child.getParent().f()时,parent都会被抓取,若设为no-proxy,调用child.getParent().f()时,parent是不会被抓取的,同时这种方式需要编译时字节码增强,否则和proxy没区别。不知道我说明白了没有....

解决方案 »

  1.   

    lazy (可选 - 默认为 proxy): 默认情况下,单点关联是经过代理的。
    lazy="no-proxy"指定此属性应该在实例变量第一次被访问时应该延迟抓取(fetche lazily)(需要运行时字节码的增强)。 
    lazy="false"指定此关联总是被预先抓取。
      

  2.   

    非常感谢 Saro 的多次帮助,也感谢 liuyxit。
    不过还有几个小问题
    是不是这个意思,如果设置了 lazy="proxy",就 Saro 提供的例子来说,当通过 child 来调用其关联的 parent, 如果调用 parent 类中定义的任何方法,都会抓取 parent (所谓的抓取是不是就是从数据库查询,执行一次 select ?) 
    如果设置了 lazy="no-proxy" ,只有调用 parent 类中牵涉到类变量的方法,才会抓取 parent,否则,就像调用 f(), 不会抓取 parent
    "编译时字节码增强" 是什么意思?
      

  3.   

    1。所谓的抓取是不是就是从数据库查询,执行一次 select ?
    对,fetch是hibernate中很重要的概念
    2."编译时字节码增强" 是什么意思?
    "字节码增强"分编译期和运行期2种,编译期是修改java类编译后的class字节码文件,在上面附加“增强”操作。