2007-03-24

[Note] Hibernate Get or Load

在Hibernate 2.x的年代,要用id取出一個物件,都是用load(),但是這個method在找不到時會丟exception,還是那種checked的。

來到Hibernate 3.x的年代,load()還是會丟exception,只不過Hibernate的exception都變成unchecked了;但是另外多了一個get(),一樣用id,最明顯差別在找不到時不會丟exception了,而僅僅只是回傳null。

事實上,get()與load()還有一個很大的差異:get()把整個obj都抓進來,不管是從db還是session cache,而load()只是回傳一個proxy,一個lazy properties只有在access時才會initialize的proxy,所以透過load()取得的obj只能用在session裡,一離開session,access未initialize的property都會出lazy exception。

所以疑問來了,load()進來的proxy用在什麼情況?先離題一下:為什麼只有session.delete(obj),沒有session.delete(id)?都是要刪除了,還要用id先把obj抓進來再殺不是多此一舉嗎?為什麼不直接用id去殺就好?因為有Hibernate interceptor的關係!

回歸正題,load()的proxy有兩個主要用途:
  • 要刪除某個物件時,用proxy就好,不用把整個物件抓進來。
  • 要建立association時,也是用proxy就好,像是child.setParent(proxyParent)這樣,因為child只需要parent的id就好,不需要其他欄位,所以proxy什麼都沒有,只有id。

沒有留言:

張貼留言