Hibernate:get和load

2018-08-12 21:21 更新

當(dāng)我們從數(shù)據(jù)庫得到一個對象的時候,我們通常有兩種比較簡單的方式,一種是通過session的get()方法,另一種是load()方法,但其實這兩種是有區(qū)別的。寫這篇文章的目的并不是為了通過Demo去給讀者演示這兩者到底是有什么區(qū)別,只是一篇總結(jié)性的文章。告訴自己需要記住Hibernate的這個點。

這兩種在查詢性能上是有一定區(qū)別的,但在項目中更傾向的肯定是load()方法。

PS,概念什么的就不詳細(xì)介紹了,主要就是列舉一下而已,因為我自己本身是對這個點比較了解了。

load和get的簡單介紹


  • load代表的是采用延遲加載方法,即當(dāng)我們采用load()方法加載一個對象時,并不會發(fā)送SQL語句,得到的只是一個包含了實體對象ID值的代理對象,只有當(dāng)我們使用具體屬性時候,才會發(fā)送SQL語句。
  • get則非常直白,當(dāng)我們通過get方法的時候,不管后邊怎樣,就先通過SQL將該對象查詢出來,也就是常說的立即加載。
  • 使用load的加載方式要比get的加載方式性能好一點,因為load加載的時候,只是得到一個代理對象,當(dāng)真正需要的時候才會去查詢。這也代表了延遲加載與立即加載的同比。

小Tips


1、get()方法來加載對象,當(dāng)我們試圖得到一個id不存在的對象時候,會報空指針異常,也就是NullPointException。

2、load()方法來加載對象,如果id不存在,若我們不使用該對象的任何屬性,啥事沒有;但如果需要使用屬性(也就是真正的去查詢該對象),會報異常,但該異常并不是空指針,而是ObjectNotFoundException。

為啥呢?還是因為延遲加載,得到的是僅包含ID的代理對象;雖然我們在使用具體的屬性時候,會發(fā)送SQL語句去進行查詢,但卻查詢不到結(jié)果,這個就好尷尬。所以你要查詢的屬性是不存在的,所以會報ObjectNotFoundException。

3、關(guān)于load還有一點比較重要,就是LazyInitializationException(懶加載異常,用過Hibernate的應(yīng)該都會接觸過N次)。

其原因還是因為延遲加載!我們通過load方法得到了代理對象,但此時我們的session關(guān)閉了,但我們的對象還是存在的啊,所以當(dāng)我們準(zhǔn)備使用該對象屬性的時候,就會報LazyInitializationException異常了。Session都關(guān)了,我還怎么去初始化= =

想到的一個SSH整合的事情


提到懶加載異常,突然想到一個點,就是我們之前在開發(fā)web項目的時候,通過load()方法得到的對象,經(jīng)常會在session關(guān)閉之后再使用。那這個時候一般都是如何解決的?

答案就是OpenSessionInViewer。關(guān)于這個嘛,隨便百度有的是教程,它在Spring與Hibernate整合過程中有一個比較重要的作用。將其配置在web.xml中。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號