Hibernate中lazy="proxy"和lazy="no-proxy"的區別
精妙的例子
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",即延遲載入可以,優化系統