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

Hibernate,iBatis,Java EE或其他Java ORM工具

苍阳成
2023-03-14
问题内容

我们正在计划大型的企业应用程序。在经历了J2EE的痛苦之后,我们将重点放在评估hibernate状态上。

新的Java EE API看起来更简单。我还阅读了一些有关Hibernate和iBatis的好东西。我们的团队对任何框架都缺乏经验。

我想确定5个主要比较点

  • 学习曲线/易用性
  • 生产率
  • 可维护性/稳定性
  • 性能/可伸缩性
  • 轻松排除故障

如果您要管理一个由约2名J2EE经验开发人员组成的团队,那么您将使用哪种ORM工具,为什么呢?


问题答案:

专门针对您的观点:

学习曲线/易用性

Ibatis与SQL有关。如果您知道SQL,那么ibatis的学习曲线就微不足道了。Ibatis在SQL之上做一些事情,例如:

  • 通过…分组;
  • 区分类型;和
  • 动态SQL。

您仍然需要学习,但是最大的障碍是SQL。

另一方面,JPA(包括Hibernate)试图与SQL保持距离,并以对象而不是关系的方式呈现事物。正如Joel指出的那样,抽象是泄漏的,JPA也不例外。要执行JPA,您仍然需要了解关系模型,SQL,查询的性能调整等。

Ibatis只会让您应用您知道的或正在学习的SQL,而JPA则需要您了解其他内容:如何配置它(XML或注释)。我的意思是弄清楚外键关系是某种关系(类型映射等)(一对一,一对多或多对多)。

如果您知道SQL,我会说学习JPA的障碍实际上更高。如果您不这样做,那么它与JPA的混合结果可能更多,可以使您有效地延迟学习SQL一段时间(但不会无限期地推迟它)。

使用JPA,一旦您设置了实体及其关系,其他开发人员就可以简单地使用它们,而无需了解有关配置JPA的所有知识。这可能是一个优势,但是开发人员仍然需要了解实体管理器,事务管理,托管对象与非托管对象等。

值得注意的是,JPA还具有自己的查询语言(JPA-SQL),您需要了解该查询语言是否知道SQL。您会发现JPA-SQL无法完成SQL可以做到的事情。

生产率

这是很难判断的。就个人而言,我认为我在ibatis上的工作效率更高,但我对SQL也很满意。有人会说,他们在Hibernate上的工作效率更高,但这可能(至少部分是由于)不熟悉SQL。

而且,JPA的生产率具有欺骗性,因为您有时会遇到数据模型或查询问题,这些问题可能需要半天时间才能解决,因为您需要打开日志记录并观察JPA提供程序正在生成什么SQL,然后再工作找出设置和调用的组合,以产生出既正确又高效的产品。

Ibatis就是这样,因为您自己编写了SQL。您可以通过在PL / SQL Developer,SQL Server Management
Studio,适用于MySQL的Navicat中运行SQL进行测试。查询正确之后,您要做的就是映射输入和输出。

我还发现JPA-QL比纯SQL更笨拙。您需要单独的工具才能运行JPA-
QL查询以查看结果,这是您需要学习的更多知识。实际上,我发现JPA的整个部分相当笨拙且笨拙,尽管有些人喜欢它。

可维护性/稳定性

Ibatis的危险在于扩散,这意味着您的开发团队可能只在需要它们时就不断添加值对象和查询,而不是寻找重用,而JPA每张表有一个实体,而一旦有了该实体,就够了。命名查询倾向于在该实体上进行,因此很难错过。临时查询仍然可以重复,但是我认为这不是一个潜在的问题。

但是,这是以牺牲刚性为代价的。通常,在应用程序中,您将需要来自不同表的零碎数据。使用SQL,这很容易,因为您可以编写一个查询(或少量查询)来一次获得所有数据并将其放入自定义值对象中。

使用JPA,您可以将该逻辑上移到业务层。实体基本上是全有或全无。现在,这并非完全正确。各种JPA提供程序将允许您部分加载实体等等,但是即使在这里,您也正在谈论相同的离散实体。如果需要4个表中的数据,则需要4个实体,或者需要将所需的数据合并到业务或表示层中的某种自定义值对象中。

我喜欢ibatis的另一件事是,您所有的SQL都是外部的(在XML文件中)。有人会说这是不利条件,但不是我。然后,通过搜索XML文件,可以相对容易地找到表和/或列的用途。将SQL嵌入代码中(或根本没有SQL的情况),很难找到它。您还可以将SQL剪切并粘贴到数据库工具中并运行它。我不能高估这些年来对我有用的次数。

性能/可伸缩性

在这里,我认为ibatis胜出。它是直接的SQL,且成本低。从本质上讲,JPA根本无法管理相同级别的延迟或吞吐量。现在,JPA所做的就是延迟和吞吐量只是很少的问题。但是,高性能系统的确存在,并且将倾向于不利于JPA等重量级解决方案。

加上ibatis,您可以编写一个查询,该查询使用所需的确切列准确返回所需的数据。从根本上说,JPA在返回离散实体时无法击败(甚至匹配)它。

轻松排除故障

我认为这对Ibatis也是一个胜利。就像我上面提到的那样,使用JPA,有时您会花费半天的时间来查询或生成所需的SQL,或者诊断由于实体管理器试图保留非托管对象(可能是批处理的一部分)而导致事务失败的问题您已经做了很多工作的工作,因此找到它可能并非易事。

如果您尝试使用不存在的表或列,那么它们都会失败。

其他标准

现在,您没有提到可移植性是您的要求之一(意味着在数据库供应商之间转移)。值得注意的是,这里JPA具有优势。注释比Hibernate
XML的可移植性差(例如,标准JPA注释与Hibernate的“本机” ID类型不等效),但它们都比ibatis / SQL更可移植。

我还看到JPA /
Hibernate用作可移植DDL的一种形式,这意味着您运行了一个小的Java程序,该程序从JPA配置创建数据库模式。使用ibatis,您需要每个受支持数据库的脚本。

The downside of portability is that JPA is, in some ways, lowest common
denominator, meaning the supported behaviour is largely the common supported
behaviour across a wide range of database vendors. If you want to use Oracle
Analytics in ibatis, no problem. In JPA? Well, that’s a problem.



 类似资料:
  • 问题内容: 在我的项目中,我需要在运行时在数据库之间切换。我尝试使用Hibernate,但是卡在一个地方,我需要在数据库中映射对象和表。问题是,我有几个带前缀的表:documents2001,documents2002 …据我了解,我在运行时无法将类与表进行映射。我尝试使用iBatis,但问题出在运行时更改数据库。在iBatis中,这很难做到。 也许一些建议,我应该使用什么? 我的要求: 能够在运

  • ThingJS PaaS 平台还提供一下相关工具来给项目开发助力,浏览下面的网页,帮助您快速掌握图表制作工具 ChartBuilder 和 LiveServer 部署包的使用方法。 ChartBuilder 用户手册 LiveServer 用户手册 ThingJS 平台三维模型制作指南

  • hash工具,主要用来计算字符串的hash值。提供三种hash算法, BKDR, JS, DJP. 根据需要自行选择 方法名 方法说明 BKDRHash 采用bkdr算法计算hash值 JSHash 采用js算法计算hash值 DJPHash DJP hash 算法,冲突率低,但是算法比较复杂,效率不是很高。 AjaxResult 用来返回json视图。提供了以下API: ajaxSuccessR

  • 一旦你掌握的窍门,安装 Babel 还是十分简明的,不过和其他工具搭配在一起就会变得困难多了。 不过我们一直在与其他项目密切合作以确保这种体验尽可能简单。 静态分析工具 新标准为语言带来了许多新的语法,静态分析工具正在将此利用起来。 语法检查(Linting) ESLint 是最流行的语法检查工具之一,因此我们维护了一个官方的 babel-eslint 整合软件包。 首先安装 eslint 和 b

  • 其他重要工具 虽然我们讨论了基本的Python版本,虚拟机和包管理,但在日常工作中我们仍然还需要一些专用的工具来完成任务。 尽管我不能把每一个工具的细节都讲到,然而我还是尽量给你提供基本的概述。 编辑器 对于Python编程有大量很优秀的编译器。对于我个人而言,我更倾向于Vim,但这里我并不想挑起一场 编辑器战争 。 有大量支持Python的编辑器,例如:Vim/Gvim, Emacs, GNOM

  • 除了个别的测试驱动和行为驱动框架之外,还有一些通用的框架和辅助函数类库,对任何的测试方法都很有用。 工具地址 Selenium 是一个浏览器自动化工具 integrated with PHPUnit Mockery 是一个可以跟 PHPUnit 或者 PHPSpec 整合的 Mock 对象框架 Prophecy 是个有自己的想法,且非常强大灵活的 PHP 对象 mocking 框架。它整合了 PH