【问题标题】:Hibernate or iBatis or something else?Hibernate 或 iBatis 或其他什么?
【发布时间】:2009-11-17 08:44:25
【问题描述】:

在我的项目中,我需要在运行时在数据库之间切换。我尝试使用 Hibernate,但卡在了一个地方,我需要将对象与数据库中的表进行映射。问题是,我有几个带有前缀的表:documents2001,documents2002 ...据我所知,我无法在运行时将类与表映射。我尝试使用 iBatis,但问题在于运行时更改数据库。在 iBatis 中,这是相当困难的。\

也许一些建议,我应该使用什么?

我的要求:

  • 能够在运行时连接到不同的数据库
  • 能够在运行时更改表(如果类映射到表,就像在 Hibernate 中一样)。

更新: 好的,我将尝试解释:
我必须编写应用程序,它可以在运行时连接到不同的数据库。应用程序的用户可以选择要连接的数据库。所有数据库都具有相同的结构。除此之外,用户可以在数据库中的表之间切换。表具有相同的结构。

  • 为什么我假设,我不能使用 Hibernate:在 Hibernate 中,类与表映射,所以我不能在运行时更改表。这不允许我选择可以连接的表。
  • 为什么我假设,我不能使用 iBATIS。在 iBATIS 中,在运行时很难连接到不同的数据库。因此,用户将无法在运行时连接到不同的数据库。

也许我可以使用其他工具?

【问题讨论】:

  • 实际上,在 Ibatis 中,如果您愿意,可以在运行时选择数据库。看我的回答。

标签: java database hibernate ibatis


【解决方案1】:

在 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 配置中)。

可以编写一个 DAO,使其注入多个 sqlMapClients,并选择在运行时使用哪一个。这是您必须自己编写的部分,但它很简单。

这是基于在编译时了解数据库的。如果数据库直到运行时才知道,那么这有点困难。这可能仍然是可能的,但我不确定如果您在运行时基本上从sqlMapClient 交换数据源,Ibatis 会如何反应。它可能会起作用,它可能会爆炸。你得试试看。

Hibernate 也可以按照相同的原理在这里工作:您将多个持久性单元注入 DAO 并在运行时使用正确的一个。使用 Hibernate(或任何 JPA 提供程序),您必须注意确保您的托管对象存储在正确的持久性单元中。我很容易看到这实际上变成了一场噩梦。

一般性评论:不建议走动态表名或数据库的路径,因此请认真考虑您在做什么以及为什么,并问问自己是否可以通过做出更好的设计选择来解决这个问题。

【讨论】:

  • 谢谢!很好的答案!我必须考虑改变这个实现的逻辑。
【解决方案2】:

表的结构是否相同,只是名称不同?

这绝对可以在 iBATIS 中映射。

您只需要在 SQL 映射中包含类似的内容:

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

假设我正确理解了您的问题,那应该可以解决您的问题。

【讨论】:

  • 不,我知道这在 iBatis 中是可能的,但在 iBatis 中是不可能在运行时更改数据库的。
【解决方案3】:

我不完全理解您的要求,但这是可能的:

Hibernate 和 iBatis 都可以从数据源工作,因此您可以创建自己的 javax.sql.DataSource 实现,每次调用 getConnection() 时返回不同的连接。

Using a DataSource in Hibernate

【讨论】:

    猜你喜欢
    • 2010-10-17
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 2011-08-26
    相关资源
    最近更新 更多