![](/img/trans.png)
[英]Is it a good idea to use a stateful bean as a presenter/controller in a MVP/MVC architecture?
[英]Is it a good idea to open a hibernate session in controller in MVC architecture?
我有一個非常復雜的域實體。 我想對所有關聯進行延遲加載。 所以場景是這樣的:
1.獲取我的業務邏輯實例。
2.從業務中獲取對象。
3.問o給我其他相關對象。
4.准備視圖。
為了擺脫在延遲加載其他對象時關閉會話的休眠異常,我想到了在控制器中打開和關閉整個會話的想法。 這是個好主意嗎? 有更好的解決方案嗎?
謝謝
鑒於會議是一種不良做法 。
這是通常用於解決此問題的層的建議:
控制者
服務
資料存取
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.