在我的项目中,我需要在运行时在数据库之间切换。我尝试使用 Hibernate,但陷入了一个需要将对象与数据库中的表映射的地方。问题是,我有几个带有前缀的表:documents2001、documents2002 ...据我所知,我无法在运行时将类与表映射。我尝试使用 iBatis,但问题在于运行时数据库发生变化。在 iBatis 中,这是很难做到的。\
也许有一些建议,我应该使用什么?
我的要求:
- 能够在运行时连接到不同的数据库
- 能够在运行时更改表(如果类映射到表,就像在 Hibernate 中一样)。
UPDATE:好的,我会尝试解释一下:
我必须编写应用程序,它可以在运行时连接到不同的数据库。应用程序的用户可以选择连接哪个数据库。所有数据库都具有相同的结构。除此之外,用户可以在数据库中的表之间切换。表具有相同的结构。
- 为什么我假设,我不能使用 Hibernate:在 Hibernate 类中与表映射,所以我不能在运行时更改表。这不允许我选择可以连接的表。
- 为什么我假设,我不能使用 iBATIS。在 iBATIS 中,在运行时连接到不同的数据库是非常困难的。因此,用户将无法在运行时连接到不同的数据库。
也许我可以使用另一个工具?
在 Ibatis 中使用动态表名非常简单。只需使用如下表达式:
SELECT * FROM $tableName$
where tableName
是参数类的属性。
在 Hibernate(或任何 JPA 提供程序)中使用动态表名即使不是不切实际(甚至不可能)也是极其困难的。这个问题以前已经出现过。看JPA:运行时如何指定类对应的表名?.
在 Ibatis 中使用动态数据源需要您编写一些代码,但不需要编写那么多代码。基本上,Ibatis 围绕以下概念工作:sqlMapClient
,它有一个数据源和一个可以运行的查询列表。只需创建一个sqlMapClient
对于每个数据库,每个数据库都有不同的数据源,并让它们包含所有相同的查询文件(在 sql 映射配置中)。
可以将 DAO 编写为具有多个sqlMapClients
注入并选择在运行时使用哪一个。这是您必须自己编写的部分,但它很简单。
这是基于在编译时了解数据库的情况。如果数据库直到运行时才知道,那就有点困难了。这可能仍然是可能的,但我不确定如果您基本上在运行时从 Ibatis 交换数据源,Ibatis 将如何反应sqlMapClient
。它可能会起作用,也可能会爆炸。你必须尝试一下才能看到。
Hibernate 在这里也可能遵循相同的原理:将多个持久性单元注入到 DAO 中,并在运行时使用正确的单元。使用 Hibernate(或任何 JPA 提供程序),您必须注意确保托管对象存储在正确的持久性单元中。我可以很容易地看到这实际上变成了一场噩梦。
一条一般性评论:不建议走动态表名称或数据库的道路,因此请认真考虑您正在做什么以及为什么这样做,并问问自己是否可以通过做出一些更好的设计选择来弥补这一问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)