2009-11-17 117 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