2009-11-17 158 views
3

在我的項目中,我需要在運行時間切換數據庫。我試圖使用Hibernate,但卡在一個地方,我需要映射對象與數據庫中的表。問題是,我有幾個表的前綴:documents2001,documents2002 ...據我所知,我不能在運行時映射類與表。我試過使用iBatis,但問題是數據庫在運行時更改。在iBatis中,這是很難做到的。\休眠或iBatis或其他東西?

也許一些建議,我該用什麼?

我的要求:

  • 能夠在運行時連接到不同的數據庫
  • 能力運行期間更改表(如果類映射到表,喜歡它是Hibernate)。

UPDATE: 好吧,我心底試圖解釋:
我必須寫申請,可在運行過程中連接到不同的數據庫。應用程序的用戶可以選擇連接哪個數據庫。所有數據庫都具有相同的結構。除此之外,用戶可以在數據庫中的表之間切換。表格具有相同的結構。

  • 爲什麼我認爲,我不能使用Hibernate:在Hibernate中類的映射使用表,所以在運行時我不能改變表。這不允許我選擇我可以連接的桌子。
  • 爲什麼我假設我不能使用iBATIS。在iBATIS中,運行時很難連接到不同的數據庫。因此,用戶將無法在運行時連接到不同的數據庫。

也許有另一種工具可以使用?

+0

實際上,在Ibatis中,如果你願意,它可以在運行時選擇數據庫。看到我的答案。 – cletus 2009-11-17 09:19:49

回答

11

與動態表名的工作是瑣碎ibatis的。只需使用以下表達式:

SELECT * FROM $tableName$ 

其中tableName是參數類的一個屬性。

與動態表名在工作Hibernate(或任何JPA提供者)是非常困難的,如果不是不切實際的(甚至不可能)。這個問題出現之前。見JPA: How do I specify the table name corresponding to a class at runtime?

與ibatis的動態數據源會要求你寫一些代碼,但不是所有的東西。基本上,Ibatis圍繞着sqlMapClient這個概念,它有一個數據源和一個可以運行的查詢列表。只需爲每個數據庫創建一個sqlMapClient,每個數據庫都有不同的數據源,並讓它們包含所有相同的查詢文件(在sql map config中)。

甲DAO可以寫爲使得它具有多個sqlMapClients注入並且它選擇哪一個在運行時使用。這是你必須自己寫的部分,但它很簡單。

這個的前提是知道數據庫在編譯時。如果直到運行時才知道數據庫,那麼這有點困難。它可能仍然是可能的,但我不確定如果在運行時基本上交換數據源從sqlMapClient,Ibatis會如何反應。它可能工作,它可能會炸燬。你必須嘗試看看。

休眠可以在這裏工作過一起同樣的原則:你注入多個持久化單元爲DAO,並在運行時使用正確的。使用Hibernate(或任何JPA提供者),您必須小心確保您的託管對象存儲在正確的持久性單元中。我可以很容易地看到這實際上變成了一場噩夢。

一個一般性評論:這不是勸走下來動態表名或數據庫的路徑,真正考慮自己在做什麼,爲什麼,問問自己,如果這可以通過做一些更好的設計選擇來彌補。

+0

謝謝!很好的答案!我必須考慮改變這個實現的邏輯。 – Yurish 2009-11-17 09:27:31

1

表格是否具有相同的結構,只是不同的名稱?

這絕對有可能在iBATIS中映射。

你只需要包括這樣的事情在你的SQL地圖:

<select id="selectAll" resultMap="result" parameterClass="myParameterClass"> 
    SELECT ColumnA, ColumnB FROM $tableName$ 
</select> 

假設我理解正確你的問題,應該解決您的問題。

+0

不,我知道這是可能的在iBatis,但在iBatis是不可能在運行時改變數據庫。 – Yurish 2009-11-17 08:51:58

1

我不完全理解你的要求,但是這是一個可能性:

Hibernate和iBatis的可以從一個數據源,所以你可以創建自己的實現javax.sql.DataSource中的返回不同的連接每次調用getConnection()。

Using a DataSource in Hibernate

+0

檢查更新的帖子。 – Yurish 2009-11-17 09:16:18