簡體   English   中英

在MVC體系結構的控制器中打開休眠會話是個好主意嗎?

[英]Is it a good idea to open a hibernate session in controller in MVC architecture?

我有一個非常復雜的域實體。 我想對所有關聯進行延遲加載。 所以場景是這樣的:

1.獲取我的業務邏輯實例。

2.從業務中獲取對象。

3.問o給我其他相關對象。

4.准備視圖。

為了擺脫在延遲加載其他對象時關閉會話的休眠異常,我想到了在控制器中打開和關閉整個會話的想法。 這是個好主意嗎? 有更好的解決方案嗎?

謝謝

鑒於會議是一種不良做法

這是通常用於解決此問題的層的建議:

控制者

  • 控制器僅關心處理Web請求,將其解釋為服務將要處理的對象以及將服務結果作為Web響應返回。 我通常在每個控制器方法中只有一個事務服務方法調用,更喜歡在一個事務中將一個控制器操作的所有數據訪問都保留下來。

服務

  • 服務層只關心從控制器接收數據,從中獲取執行操作所需的數據(從數據層),並返回有意義的結果。 該服務應完全加載控制器所需的所有延遲加載的實體。 這里的服務方法是事務性的,不會出現延遲加載問題,您可以組合多個DAO的結果。 這樣,DAO無需彼此了解

資料存取

  • 數據訪問層僅與持久性(CRUD)有關,它允許通過過濾,排序等方式訪問數據。

Spring有一個opensessioninviewfilter和一個opensessininviewinterceptor ,它們應該為您處理此功能。

作為一種設計模式,openinig會話的觀點非常糟糕。 我認為SpringMVC的設置會導致您打開會話並解決您的問題。

但是,如果您的應用程序比寵物商店復雜,我建議不要使用此模式。 我建議將數據檢索和業務邏輯向下移動一層,並在控制器中僅保留與UI相關的代碼。 認真思考關系並對其設置急切和懶惰的設置應該有效。 不進行分析而將所有內容設置為惰性不是一個好主意。 每個請求最終將進行數百次SQL調用。

我建議將L2緩存(例如EHCache)插入Hibernate。 配置和使用非常簡單。

您確實可以做到,這是使用Spring和Hibernate時的常見模式。 通過將下面的代碼放入web.xml中,可以非常輕松地啟用它

<filter>
    <filter-name>lazyLoadingFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>lazyLoadingFilter</filter-name>
    <url-pattern>/mvc/*</url-pattern>
</filter-mapping>

一旦設置好位置,該調用中在休眠狀態下進行的每個調用都將使用相同的會話:

@Autowired
protected SessionFactory sessionFactory;

protected Session getSession() {

    return SessionFactoryUtils.getSession(sessionFactory, true);
}

但是,正如Peter Gwiazda所說,您可能會或可能不想這樣做,具體取決於應用程序的規模和復雜性。 聽起來您的對象很復雜,所以當您在JSP中遍歷實體時,讓視圖本質上會觸發更多的SQL語句,或者任何不會帶來出色性能的事情。

通常,將視圖滿足需求的對象轉換為DTO並限制從數據庫中取回的數據量通常是更好的模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM