Hibernate或iBatis还是其他什么?
在我的项目中,我需要在运行时在数据库之间切换。 我试图使用Hibernate,但卡在一个地方,我需要用数据库中的表映射对象。 问题是,我有几个带前缀的表:documents2001,documents2002 ……据我所知,我无法在运行时使用表映射类。 我尝试使用iBatis,但问题是在运行时期间数据库更改。 在iBatis中,这很难做到。
也许有些建议,我该怎么用?
我的要求:
- 能够在运行时连接到不同的数据库
- 能够在运行时更改表(如果类映射到表,就像它在Hibernate中一样)。
更新:好的,我会试着解释一下:
我必须编写应用程序,它可以在运行时连接到不同的数据库。 app的用户可以选择,连接哪个数据库。 所有数据库都具有相同的结构。 除此之外,用户还可以在数据库中的表之间切换。 表具有相同的结构。
- 为什么我假设,我不能使用Hibernate:在Hibernate类中映射表,所以我不能在运行时更改表。 这不允许我选择我可以连接的表。
- 为什么我假设,我不能使用iBATIS。 在iBATIS中,在运行时期间很难连接到不同的数据库。 因此,用户将无法在运行时连接到不同的数据库。
也许我可以使用另一种工具?
在Ibatis中使用动态表名称是微不足道的。 只需使用以下表达式:
SELECT * FROM $tableName$
其中tableName
是参数类的属性。
在Hibernate(或任何JPA提供程序)中使用动态表名称,如果不是不切实际(甚至不可能),则非常困难。 之前提出过这个问题。 请参阅JPA:如何在运行时指定与类对应的表名? 。
在Ibatis中使用动态数据源需要您编写一些代码但不是那么多。 基本上,Ibatis围绕sqlMapClient
的概念工作,它具有数据源和可以运行的查询列表。 只需为每个数据库创建一个sqlMapClient
,每个数据库都有不同的数据源,并让它们包含所有相同的查询文件(在sql map配置中)。
可以编写DAO,使其注入多个sqlMapClients
,并选择在运行时使用哪一个。 这是你必须自己写的部分,但它很简单。
这是基于在编译时了解数据库。 如果直到运行时才知道数据库,那就更难了。 它可能仍然是可能的,但我不确定如果您基本上在运行时从sqlMapClient
交换数据源,Ibatis将如何反应。 它可能会起作用,它可能会爆炸。 你必须尝试看看。
Hibernate也可以按照相同的原则工作:将多个持久性单元注入DAO并在运行时使用正确的单元。 使用Hibernate(或任何JPA提供程序),您必须注意确保托管对象存储在正确的持久性单元中。 我很容易看到这实际上变成了一场噩梦。
一个普遍的评论:不建议沿着动态表名或数据库的路径走下去,所以要真正考虑你正在做什么以及为什么要问自己是否可以通过做出更好的设计选择来解决这个问题。
表格是否具有相同的结构,只是名称不同?
这绝对可以在iBATIS中映射。
您只需要在SQL Map中包含这样的内容:
假设我已正确理解你的问题,那应该可以解决你的问题。
我不完全理解你的要求,但这是一种可能性:
Hibernate和iBatis都可以在DataSource中工作,因此您可以创建自己的javax.sql.DataSource实现,每次调用getConnection()时都会返回不同的连接。
在Hibernate中使用DataSource
- Hibernate HQL Join Query DOT节点没有左侧
- Hibernate SQL查询结果映射/转换为对象/类/ Bean
- hibernate是否保留LinkedHashSet的顺序,如果是,如何?
- 如何设置Hibernate来读/写不同的数据源?
- java hibernate:在多态hql查询中选择discriminator列
- HibernateException:连接太多,使用c3p0
- postInstantiate buildSessionFactory慢/内存庞大的数据库
- Hibernate使用自定义修订实体
- 为什么在Hibernate中不建议使用“hibernate.connection.autocommit = true”?