鍍金池/ 教程/ Java/ load和get的簡(jiǎn)單介紹
雙向1-1關(guān)聯(lián)
單向N-N關(guān)聯(lián)
導(dǎo)讀
概述
Hibernate緩存
悲觀鎖
雙向1-N關(guān)聯(lián)
作者簡(jiǎn)介
概述
load和get的簡(jiǎn)單介紹
單向N-1關(guān)聯(lián)

load和get的簡(jiǎn)單介紹


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

小Tips


1、get()方法來加載對(duì)象,當(dāng)我們?cè)噲D得到一個(gè)id不存在的對(duì)象時(shí)候,會(huì)報(bào)空指針異常,也就是NullPointException。

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

為啥呢?還是因?yàn)檠舆t加載,得到的是僅包含ID的代理對(duì)象;雖然我們?cè)谑褂镁唧w的屬性時(shí)候,會(huì)發(fā)送SQL語句去進(jìn)行查詢,但卻查詢不到結(jié)果,這個(gè)就好尷尬。所以你要查詢的屬性是不存在的,所以會(huì)報(bào)ObjectNotFoundException。

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

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

想到的一個(gè)SSH整合的事情


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

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

上一篇:Hibernate緩存下一篇:悲觀鎖