1. 程式人生 > >Hibernate中lazy="proxy"和lazy="no-proxy"的區別

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",即延遲載入可以,優化系統