一尘不染

Hibernate或iBatis还是其他?

hibernate

在我的项目中,我需要在运行时在数据库之间切换。我尝试使用Hibernate,但是卡在一个地方,我需要在数据库中映射对象和表。问题是,我有几个带前缀的表:documents2001,documents2002
…据我了解,我在运行时无法将类与表进行映射。我尝试使用iBatis,但问题出在运行时更改数据库。在iBatis中,这很难做到。

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

我的要求:

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

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

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

也许我可以使用另一种工具?


阅读 193

收藏
2020-06-20

共1个答案

一尘不染

在Ibatis中使用动态表名称很简单。只需使用如下表达式:

SELECT * FROM $tableName$

其中tableName是参数类的属性。

如果不是不切实际的话(甚至是不可能的话),在Hibernate(或任何JPA提供程序)中使用动态表名是非常困难的。这个问题之前已经提出。

在Ibatis中使用动态数据源将需要您编写一些代码,但不需要那么多。基本上,Ibatis围绕a的概念工作sqlMapClient,它具有数据源和可以运行的查询列表。只需sqlMapClient为每个数据库创建一个数据库,每个数据库都有不同的数据源,并让它们包括所有相同的查询文件(在sql
map配置中)。

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

这是基于在编译时知道数据库的前提。如果直到运行时才知道该数据库,则要难一些。仍然有可能,但是我不确定如果从运行时基本上在运行时交换数据源,Ibatis会如何反应sqlMapClient。它可能会起作用,它可能会崩溃。您必须尝试一下才能看到。

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

一个普遍的评论:不建议沿着动态表名称或数据库的路径走,所以请真正考虑您在做什么以及为什么这样做,并问自己是否可以通过做出一些更好的设计选择来补救。

2020-06-20