淺談hibernate中懶載入禁用操作
淺談hibernate中懶載入禁用操作
懶載入的概念:懶載入就是hibernate中的延遲載入,在hibernate中的一對多,多對多關係中通過物件導航來查詢物件時一般預設的就是懶載入。就是當我們查詢一個物件的時候,在預設情況下,返回的只是該物件的代理物件,當用戶去使用該物件的屬性是,才會向資料庫中再一次發出查詢語句。懶載入在某些情況下確實可以減少不必要的sql語句,但是有的情況下,還是會丟擲異常。
下面我將介紹懶載入禁用的方式
方式一:
在需要禁用懶載入的實體物件的配置檔案中配置lazy="false";
例如:
<many-to-one name="lkm_cust_id" lazy="false" column="lkm_cust_id" class="com.haha.domain.Customer"/>
方式二:
在service中強行載入這個代理物件,因為service層提交完事務之後,session就關閉了;所以要在session關閉之前把這個代理物件給載入了。
public Customer toedit(Customer customer) { Customer c= customerDao.toedit(customer); Hibernate.initialize(c);//強行載入 return c; }
方式三:
注意:這種方法可以高效的解決我們的no-session問題
這個方法用於ssh整合時,其實它跟方式二的原因是一樣的,但是解決的方式不同,這種方法是延長session的生命週期,讓session在jsp頁面載入完畢後在關閉。
這個過濾器不需要我們寫,因為spring已經給我們提供了一個這樣的過濾器類,我們只需配置就可以使用
在web.xml中配置
<!-- 解決no-session問題過濾器 通過filter來讓session在jsp頁面完畢後再關閉session 注意: 所有Filter的配置都需要放置在struts2入口過濾器配置之前 --> <filter> <filter-name>openSessionInView</filter-name> <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>openSessionInView</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
補充知識:hibernate中懶載入和急載入的區別?
1、fetch = FetchType.LAZY ----懶載入
在載入一個實體的時候,不會馬上從資料庫中載入,即從資料庫中載入到記憶體中。
2、fetch = FetchType.EAGER ----急載入
在載入一個實體時,會立即從資料庫中查詢,與其關聯的類也會被同時查詢。
在我們使用@ManyToOne等時,都會被預設為急載入。
以上這篇淺談hibernate中懶載入禁用操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。