当前位置: 首页 > 面试题库 >

Hibernate或iBatis还是其他?

王念
2023-03-14
问题内容

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

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

我的要求:

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

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

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

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


问题答案:

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

SELECT * FROM $tableName$

其中tableName是参数类的属性。

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

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

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

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

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

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



 类似资料:
  • 问题内容: 我们正在计划大型的企业应用程序。在经历了J2EE的痛苦之后,我们将重点放在评估hibernate状态上。 新的Java EE API看起来更简单。我还阅读了一些有关Hibernate和iBatis的好东西。我们的团队对任何框架都缺乏经验。 我想确定5个主要比较点 学习曲线/易用性 生产率 可维护性/稳定性 性能/可伸缩性 轻松排除故障 如果您要管理一个由约2名J2EE经验开发人员组成的

  • 问题内容: 在数据访问层中具有Spring&Hibernate(JPA)的Java应用程序堆栈中,有什么好的方法来应用密码加密(希望使用注释),以及在哪里可以找到更多有关完成密码的方法(教程等)? 可以理解,我将使用JCA支持的算法对密码进行加密,但是如果有一种简便的方法,我宁愿不必实现包装逻辑。 我正在查看Jasypt,并且是a)想知道这是否是一个不错的选择以及如何做到这一点,以及b)人们还在为

  • 问题内容: 我正在尝试捕获WebBrowser控件的内容。可以完美地工作,但是WebBrowser控件的文档中不支持它。我一直在尝试寻找另一种捕获WebBrowser控件的内容并将其保存到本地图像文件的方法。 是否有人有任何变通办法或其他方法将WebBrowser控件的内容保存到本地图像文件? 问题答案: Control.DrawToBitmap并不总是能正常工作,因此我诉诸于以下提供更一致结果的

  • 问题内容: 我正在研究Java,.NET和Groovy中企业应用程序的开发。对于每个平台,我们将尝试实现一个简单的SOAP Web服务有多困难。我们将使用最常用的工具和库来尽可能准确地研究现实世界。 在这方面,当使用Hibernate进行持久化时,是否会更好地反映出使用新的JPA(Java Persistence API)或JPA出现之前就已经存在的Hibernate自定义API的真实情况? 问题

  • 问题内容: 我有,与有着多对多的关系。 因此表布局为: 为了得到实体A的对象:我叫其不 使用spring和hibernate。 问题是,有时后续代码仅需要A,有时后续代码将继续访问关联的B,因此我们希望在某些情况下使用 延迟加载, 在某些情况下则 渴望 使用。但是问题是所有数据库访问都是通过同一单一数据库提供的,因此只有一种方法。 我应该创建方法getById()的两个版本吗? 但是对于更复杂的情

  • 这个问题基本上是不言自明的。我还没有找到一个数组的应用编程接口(除了这个数组,但这只是定义了一堆用于处理实际数组的静态助手函数)。如果没有它的类,这似乎表明数组不可能是一个。 然而,数组有公共字段,比如,以及它可以调用的方法,比如和似乎(非常强烈地)表明了完全相反的观点。 原语数组的奇怪表示和行为的解释是什么? 注意,我刚才试图在数组的方法上使用“开放实现”Eclipse特性,希望我能够看看这个方