Hibernate或iBatis还是其他什么?

Yur*_*ish 3 java database hibernate ibatis

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

也许有些建议,我该怎么用?

我的要求:

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

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

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

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

cle*_*tus 11

使用动态表名在Ibatis中是微不足道的.只需使用以下表达式:

SELECT * FROM $tableName$
Run Code Online (Sandbox Code Playgroud)

where tableName参数类的属性.

在Hibernate(或任何JPA提供程序)中使用动态表名称,如果不是不切实际(甚至不可能),则非常困难.之前提出过这个问题.请参阅JPA:如何在运行时指定与类对应的表名?.

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

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

这是基于在编译时知道数据库.如果直到运行时才知道数据库,那就更难了.它可能仍然是可能的,但我不确定如果你基本上在运行时交换数据源,Ibatis将如何反应sqlMapClient.它可能会起作用,它可能会爆炸.你必须尝试看看.

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

一个一般性评论:不建议沿着动态表名或数据库的路径走下去,所以要真正考虑你正在做什么以及为什么要问自己是否可以通过做出更好的设计选择来解决这个问题.