首先先上BUG
FreeMarker template error (HTML_DEBUG mode; use RETHROW in production!)
Java method "com.itheima.crm.domain.BaseDict_$$_jvst101_2.toString()" threw an exception when invoked on com.itheima.crm.domain.BaseDict_$$_jvst101_2 object [freemarker.core._DelayedJQuote.toString() failed: org.hibernate.LazyInitializationException: could not initialize proxy - no Session]; see cause exception in the Java stack trace.
.........
延遲加載(load)是Hibernate為提高程序執(zhí)行效率而提供的一種機(jī)制,即只有真正使用該對象的數(shù)據(jù)時才會創(chuàng)建锚扎。
延遲加載的過程:通過代理(Proxy)機(jī)制來實現(xiàn)延遲加載娜亿。Hibernate從數(shù)據(jù)庫獲取某一個對象數(shù)據(jù)時、獲取某一個對象的集合屬性值時蒋院,或獲取某一個對象所關(guān)聯(lián)的另一個對象時,由于沒有使用該對象的數(shù)據(jù)(除標(biāo)識符外)莲绰,Hibernate并不從數(shù)據(jù)庫加載真正的數(shù)據(jù)欺旧,而只是為該對象創(chuàng)建一個代理對象來代表這個對象,這個對象上的所有屬性都為默認(rèn)值蛤签;只有在真正需要使用該對象的數(shù)據(jù)時才創(chuàng)建這個真正的對象辞友,真正從數(shù)據(jù)庫中加載它的數(shù)據(jù)。
當(dāng)調(diào)用Session上的load()方法加載一個實體時震肮;當(dāng)Session加載某個實體時称龙,會對這個實體中的集合屬性值采用延遲加載;當(dāng)Session加載某個實體時戳晌,會對這個實體所單端關(guān)聯(lián)的另一個實體對象采用延遲加載
解決延遲加載最簡單也是最笨的方法:在加載單個實體時鲫尊,可以使用get()方法。
關(guān)閉延遲加載一:
對于實體中的集合屬性沦偎,可以在這個集合的(<set>,<list>)添加屬性lazy="false"马昨。單端關(guān)聯(lián)另一個實體對象時竞帽,可以在映射文件中配置.
添加屬性lazy="false"注意:one-to-one不能有constrained=true(產(chǎn)生的sql語句中顯示外鍵),否則懶加載不起作用。
關(guān)閉延遲加載二:
在web.xml文件中配置過濾器,用來將session提前到Action中開啟
這兩種情況可以真正的解決延遲加載問題