精妙的例子
Child <- many-to-one ->Parent
class 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,只有調用 parent 類中牽涉到類變量的方法,纔會抓取 parent,否則,就像調用 f(), 不會抓取 parent,如調用child.getParent().f()時,parent是不會被抓取的,同時這種方式需要編譯時字節碼增
強,否則和proxy沒區別。
再看看lazy="true"和lazy="false"的用法
lazy代表延時加載,lazy=false,代表不延時,如果對象A中還有對象B的引用,會在A的xml映射文件中配置b的對象引用,多對一或一對多,不延時代表查詢出對象A的時候,會把B對象也查詢出來放到A對象的引用中,A對象中的B對象是有值的。如果lazy=true,代表延時,查詢A對象時,不會把B對象也查詢出來,只會在用到A對象中B對象時纔會去查詢,默認的是true,你可以看看後臺的sql語句的變化就明白了,一般需要優化效率的時候會用到。
lazy="proxy"和lazy="no-proxy"可以看做是一種lazy="false",即延遲加載可以,優化系統