0

我有一個一般設計問題,現在困擾了我一段時間。使用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傳遞給幾個類並不好。

你會採取什麼方法來實現所述目標?

我真的很感激,如果有人可以幫忙。如果您需要更多信息,請告訴我,我會提供!

+0

對於[http://programmers.stackexchange.com](http://programmers.stackexchange.com),這可能是一個更好的問題,因爲它涉及的設計多於特定的編碼問題。 – Kyle 2011-06-15 22:13:34

回答

0

您有困惑的要求和解決方案嗎?

數據爲每個項目都必須 分離(成不同的數據庫)

真的要求你有不同的數據庫,或者是它只是數據爲每個項目必須分開

如果不同的數據庫不是絕對的要求,只需在表中添加一個user_id列,以便您可以爲所有用戶使用相同的表格,但仍然可以實現此要求。

你可以稱這種方法垂直分割數據,而不是水平

好處應該立即顯而易見:突然你的解決方案簡單得多,這是件好事。

相關問題