我有一個一般設計問題,現在困擾了我一段時間。使用Java EE和Hibernate的多個項目的Web應用程序
目標:
- 創建使用Vaadin爲前端
- 用戶必須能夠在運行時創建項目的Web應用程序。每個項目都使用相同的(域)模式,但不同的數據
- 每個項目的數據必須分開(成不同的數據庫)
- 用戶可以登錄,選擇項目,並獲得了特定的數據庫
- 不同的用戶可以訪問同時
- 應用程序使用Hibernate與註解和編程配置
現狀在不同的項目工作
- 靜態的HibernateUtil在很多地方使用(getSessionFactory.getCurrentSession)
- 的session-per-查看模式與ThreadLocal中的部分實施,以獲得當前應用程序實例,通過使用HTTPServletRequestListener打開的會話級(和交易)管理器的工作原理並關閉會話和交易前,瀏覽請求,沒有直接訪問視圖層
- 邏輯層後:
- 在一些地方,當前會話是在其他地方使用靜態的HibernateUtil
- ,通過設置得會話管理器通過構造函數。然後這個會話管理器被傳遞給DAO以提供數據檢索會話
- 創建項目時,使用Hibernates創建選項來創建數據庫(將來可以在創建時切換到靜態ddl導入)
問題
正如人們可以想像,存在着各種問題:
- 靜態訪問sessionfactory以獲取會話不能用於多個項目,因爲靜態HibernateUtil只能同時攜帶一個(db)url,所以會話混合
- 從邏輯層訪問SessionManager並不好(需要提供它通過幾個構造函數)的不同方法
- 混合物難看,但目標是要理順這個
思考
- 實現依賴injec即使在邏輯層中也能提供正確的DAOFactory。嘗試了Guice,但如果實例不是通過Injector創建的,請獲取空指針異常(請參閱我的其他問題)。因此它不起作用。
我希望我能在代碼中的任何地方注入/使用正確的DAO工廠實例(它有權訪問正確的會話/數據庫)邏輯層知道哪個當前數據庫被加載。所以邏輯層不應該關心會話處理或任何事情。我只是想在任何地方打一個xyDAO.find(id)或類似的調用,它會得到正確的數據庫。我也認爲,如果只有一個類在邏輯上需要它,那麼通過構造函數將SessionManager傳遞給幾個類並不好。
你會採取什麼方法來實現所述目標?
我真的很感激,如果有人可以幫忙。如果您需要更多信息,請告訴我,我會提供!
對於[http://programmers.stackexchange.com](http://programmers.stackexchange.com),這可能是一個更好的問題,因爲它涉及的設計多於特定的編碼問題。 – Kyle 2011-06-15 22:13:34