在我的项目中,我需要在运行时在数据库之间切换。我尝试使用Hibernate,但是卡在一个地方,我需要在数据库中映射对象和表。问题是,我有几个带前缀的表:documents2001,documents2002 …据我了解,我在运行时无法将类与表进行映射。我尝试使用iBatis,但问题出在运行时更改数据库。在iBatis中,这很难做到。
也许一些建议,我应该使用什么?
我的要求:
更新: 好的,我将尝试解释: 我必须编写应用程序,它可以在运行时连接到不同的数据库。应用程序的用户可以选择要连接的数据库。所有数据库都具有相同的结构。除此之外,用户可以在数据库中的表之间切换。表具有相同的结构。
也许我可以使用另一种工具?
在Ibatis中使用动态表名称很简单。只需使用如下表达式:
SELECT * FROM $tableName$
其中tableName是参数类的属性。
tableName
如果不是不切实际的话(甚至是不可能的话),在Hibernate(或任何JPA提供程序)中使用动态表名是非常困难的。这个问题之前已经提出。
在Ibatis中使用动态数据源将需要您编写一些代码,但不需要那么多。基本上,Ibatis围绕a的概念工作sqlMapClient,它具有数据源和可以运行的查询列表。只需sqlMapClient为每个数据库创建一个数据库,每个数据库都有不同的数据源,并让它们包括所有相同的查询文件(在sql map配置中)。
sqlMapClient
可以编写DAO,使其sqlMapClients注入多个,并在运行时选择要使用的DAO 。这是您必须自己编写的部分,但是很简单。
sqlMapClients
这是基于在编译时知道数据库的前提。如果直到运行时才知道该数据库,则要难一些。仍然有可能,但是我不确定如果从运行时基本上在运行时交换数据源,Ibatis会如何反应sqlMapClient。它可能会起作用,它可能会崩溃。您必须尝试一下才能看到。
Hibernate也可以按照相同的原理在这里工作:将多个持久性单元注入DAO,并在运行时使用正确的单元。使用Hibernate(或任何JPA提供程序)时,您必须当心以确保将托管对象存储在正确的持久性单元中。我很容易看到这实际上变成了一场噩梦。
一个普遍的评论:不建议沿着动态表名称或数据库的路径走,所以请真正考虑您在做什么以及为什么这样做,并问自己是否可以通过做出一些更好的设计选择来补救。