閱讀57 返回首頁    go 魔獸


hibernate中的lazy的proxy 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,調用child.getParent().f()時,parent是不會被抓取的,同時這種方式需要編譯時字節碼增強,否則和proxy沒區別。 (注:測試發現真和proxy一樣,不能理解 編譯時字節碼增強,要再哪修改,或是什麼條件?)

如果設置了 lazy="proxy",就當通過 child 來調用其關聯的 parent, 如果調用 parent 類中定義的任何方法,都會抓取 parent (所謂的抓取是不是就是從數據庫查詢,執行一次 select ?)
如果設置了 lazy="no-proxy" ,隻有調用 parent 類中牽涉到類變量的方法,才會抓取 parent,否則,就像調用 f(), 不會抓取 parent

"編譯時字節碼增強" 是什麼意思?
"字節碼增強"分編譯期和運行期2種,編譯期是修改java類編譯後的class字節碼文件,在上麵附加“增強”操作。(不明白why?)


lazy (可選 - 默認為 proxy): 默認情況下,單點關聯是經過代理的。lazy="no-proxy"指定此屬性應該在實例變量第一次被訪問時應該延遲抓取(fetche lazily)(需要運行時字節碼的增強)。 lazy="false"指定此關聯總是被預先抓取。注意,如果constrained="false", 不可能使用代理,Hibernate會采取預先抓取!

原帖地址:https://apps.hi.baidu.com/share/detail/38568475

最後更新:2017-04-02 22:16:02

  上一篇:go Asp.net中Json數據的轉化,讀取與應用
  下一篇:go myeclipse9中Jquery.js提示出錯