2012-07-25 38 views
4
try { 
    x = session.load(...); 
    y = x; 
} 
catch(Exception e) { 
    //do something 
} 

如果該鍵不存在,將加載(...)拋出一個異常什麼時候休眠Session.load()拋出一個異常

  1. 馬上
  2. 將返回一個代理和那麼當對象試圖從db中獲取對象時會拋出異常 ?

另外,在上面的代碼中,如果執行達到賦值y = x,那麼它是否保證在那一點上,x不爲空?有沒有這種情況下,在這一點上x可以爲空?

回答

6

簡而言之:

  • x不會是負載後空,所以也不會y
  • 有可能或不可能是一個例外從load()如果對象不存在
  • 如果沒有來自load()的異常,且該對象不存在,則在訪問xy時會出現異常。

要闡述:

你們是不是要確定關鍵是現在?或者你認爲它是,但只是想處理異常?

documentation,具體是:

你不應該使用這種方法來確定一個實例存在(使用get()代替)。只用它來檢索你認爲存在的實例,其中不存在將是一個實際的錯誤。

從使用load()方法的書「冬眠在行動」:

的應用可以獲取而無需訪問數據庫檢索其持久有效的參考(代理)到 持久化實例州。因此, load()可能不會在緩存或數據庫中找到持久對象 時引發異常;當代理服務器 被訪問時,將會拋出異常。

所以

如果你正在尋找了解該項目是否存在,使用get(),不load()

+0

+1 - 從技術上講,它可以在得到對象後拋出異常**如果**對象被延遲加載。所以我錯了。 – hvgotcodes 2012-07-25 23:42:54

+0

謝謝@Tass。我會將此作爲正確答案繼續。 – user1539577 2012-07-25 23:44:08

2

添加到由@Tass的反應,我發現(感謝同事)

  1. 拋出異常立即如果@Proxy(懶惰=「假」)
  2. 異常如果@Proxy(懶惰=「真」)
相關問題