當(dāng)我們從數(shù)據(jù)庫得到一個對象的時候,我們通常有兩種比較簡單的方式,一種是通過session的get()方法,另一種是load()方法,但其實這兩種是有區(qū)別的。寫這篇文章的目的并不是為了通過Demo去給讀者演示這兩者到底是有什么區(qū)別,只是一篇總結(jié)性的文章。告訴自己需要記住Hibernate的這個點。
這兩種在查詢性能上是有一定區(qū)別的,但在項目中更傾向的肯定是load()方法。
PS,概念什么的就不詳細(xì)介紹了,主要就是列舉一下而已,因為我自己本身是對這個點比較了解了。
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)了,我還怎么去初始化= =
提到懶加載異常,突然想到一個點,就是我們之前在開發(fā)web項目的時候,通過load()方法得到的對象,經(jīng)常會在session關(guān)閉之后再使用。那這個時候一般都是如何解決的?
答案就是OpenSessionInViewer。關(guān)于這個嘛,隨便百度有的是教程,它在Spring與Hibernate整合過程中有一個比較重要的作用。將其配置在web.xml中。
更多建議: