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

2024-01-03

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

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

我想确定 5 个主要比较点

  • 学习曲线/易用性
  • 生产率
  • 可维护性/稳定性
  • 性能/可扩展性
  • 易于故障排除

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


让我来尝试一下。首先,我写了一些关于这个主题的文章使用 ORM 还是普通 SQL? https://stackoverflow.com/questions/494816/using-an-orm-or-plain-sql/494853#494853。具体针对您的观点:

学习曲线/易用性

Ibatis 是关于 SQL 的。如果您了解 SQL,那么 ibatis 的学习曲线就很简单。 Ibatis 在 SQL 之上做一些事情,例如:

  • 通过...分组;
  • 受歧视的类型;和
  • 动态SQL。

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

另一方面,JPA(包括 Hibernate)试图与 SQL 保持距离,并以对象而不是关系的方式呈现事物。然而,正如乔尔指出的那样,抽象存在漏洞 http://www.joelonsoftware.com/articles/LeakyAbstractions.htmlJPA 也不例外。要进行 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、Navicat for MySQL 等中运行 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,您需要为每个受支持的数据库编写一个脚本。

可移植性的缺点是 JPA 在某些方面是最低公分母,这意味着支持的行为很大程度上是各种数据库供应商所支持的常见行为。如果你想在ibatis中使用Oracle Analytics,没问题。在JPA?嗯,这是一个问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hibernate、iBatis、Java EE 或其他 Java ORM 工具 的相关文章

  • 开始 Java EE

    我对 Java 了解一些 但对 Enterprise Java 完全陌生 我正在尝试使用 NetBeans 6 1 和 GlassFish 应用服务器 请指导我一些资源 这些资源实际上告诉我什么是 java 企业应用程序 它们与普通 jav
  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • CXF Swagger2功能添加安全定义

    我想使用 org apache cxf jaxrs swagger Swagger2Feature 将安全定义添加到我的其余服务中 但是我看不到任何相关方法或任何有关如何执行此操作的资源 下面是我想使用 swagger2feature 生成
  • Convert.FromBase64String 方法的 Java 等效项

    Java 中是否有相当于Convert FromBase64String http msdn microsoft com en us library system convert frombase64string aspx which 将指
  • java中删除字符串中的特殊字符?

    如何删除字符串中除 之外的特殊字符 现在我用 replaceAll w s 它删除了所有特殊字符 但我想保留 谁能告诉我我该怎么办 Use replaceAll w s 我所做的是将下划线和连字符添加到正则表达式中 我添加了一个 连字符之前
  • Java 页面爬行和解析之 Crawler4j 与 Jsoup

    我想获取页面的内容并提取其中的特定部分 据我所知 此类任务至少有两种解决方案 爬虫4j https github com yasserg crawler4j and Jsoup http jsoup org 它们都能够检索页面的内容并提取其
  • Java中接口作为方法参数

    前几天去面试 被问到了这样的问题 问 反转链表 给出以下代码 public class ReverseList interface NodeList int getItem NodeList nextNode void reverse No
  • 如何在 JFreeChart TimeSeries 图表上显示降雨指数和温度?

    目前 我的 TimeSeries 图表每 2 秒显示一个位置的温度 现在 如果我想每2秒显示一次降雨指数和温度 我该如何实现呢 这是我的代码 import testWeatherService TestWeatherTimeLapseSer
  • 制作java包

    我的 Java 类组织变得有点混乱 所以我要回顾一下我在 Java 学习中跳过的东西 类路径 我无法安静地将心爱的类编译到我为它们创建的包中 这是我的文件夹层次结构 com david Greet java greeter SayHello
  • 尝试使用 Ruby Java Bridge (RJB) gem 时出现错误“无法创建 Java VM”

    我正在尝试实现 Ruby Java Bridge RJB gem 来与 JVM 通信 以便我可以运行 Open NLP gem 我在 Windows 8 上安装并运行了 Java 所有迹象 至少我所知道的 都表明 Java 已安装并可运行
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • 运行 Jar 文件时出现问题

    我已将 java 项目编译成 Jar 文件 但运行它时遇到问题 当我跑步时 java jar myJar jar 我收到以下错误 Could not find the main class myClass 类文件不在 jar 的根目录中 因
  • Keycloak - 自定义 SPI 未出现在列表中

    我为我的 keycloak 服务器制作了一个自定义 SPI 现在我必须在管理控制台上配置它 我将 SPI 添加为模块 并手动安装 因此我将其放在 module package name main 中 并包含 module xml 我还将其放
  • 如何配置eclipse以保持这种代码格式?

    以下代码来自 playframework 2 0 的示例 Display the dashboard public static Result index return ok dashboard render Project findInv
  • Springs 元素“beans”不能具有字符 [children],因为该类型的内容类型是仅元素

    我在 stackoverflow 中搜索了一些页面来解决这个问题 确实遵循了一些正确的答案 但不起作用 我是春天的新人 对不起 这是我的调度程序 servlet
  • 将2-3-4树转换为红黑树

    我正在尝试将 2 3 4 树转换为 java 中的红黑树 但我无法弄清楚它 我将这两个基本类编写如下 以使问题简单明了 但不知道从这里到哪里去 public class TwoThreeFour
  • 如何修复“sessionFactory”或“hibernateTemplate”是必需的问题

    我正在使用 Spring Boot JPA WEB 和 MYSQL 创建我的 Web 应用程序 它总是说 sessionFactory or hibernateTemplate是必需的 我该如何修复它 我已经尝试过的东西 删除了本地 Mav
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item
  • Swagger/Openapi-Annotations:如何使用 $ref 生成 allOf?

    我正在生成 Rest 端点 包括添加OpenAPI Swagger对生成的代码进行注释 虽然它对于基本类型运行得很好 但我在自定义类方面遇到了一些问题 现在我有很多自定义类的重复架构条目 使用 Schema 实现 MyClass class

随机推荐

  • Apache poi 多行项目符号点可以工作,但不能多段落?

    使用 apache poi 库生成 Word 文档要点正在工作 但我尝试多个段落不起作用 我已粘贴在下面 我的java类代码 package samplebuller import java io FileInputStream impor
  • 如何在 PHP 中拆分字符串中的泰米尔字符

    如何拆分字符串中的泰米尔语字符 当我使用preg match all u str results 我得到字符 和 如何获得组合字符 和 我想你应该能够使用the grapheme extract功能 http php net manual
  • 实例替代IO的目的是什么?

    此实例似乎行为不正常 gt guard True lt gt guard False gt guard False lt gt guard False Exception user error mzero 有人可能会争辩说 这不会导致任何其
  • 用户界面问题:一种让 MDI 子项显示在任务栏中的方法?

    我希望得到您对以下问题的建议 我们正在为正在开发的 Windows 窗体应用程序研究不同的用户界面解决方案 我们得出的结论是 在我看来 最好的解决方案是单文档界面 就像 MS Word 那样 也就是说 每次我们创建一个新文档时 它将在一个新
  • 将我的应用程序与联系人集成

    我想将我的应用程序与联系人管理器集成 更确切地说 当我在手机中运行 联系人 应用程序 然后单击任何头像时 会出现一个弹出 快速联系人徽章 窗口 其中包含一些可供选择的应用程序 联系人 邮件等 我想在该位置添加我的应用程序 那可能吗 我希望能
  • 如何在 Jetpack Compose Desktop 中加载字体?

    在 Android 版 Jetpack Compose 中 您可以执行以下操作 val fontFamily FontFamily Font resId R font my font 400 regular weight FontWeigh
  • 将自定义 Forager 与 OptaPlanner 结合使用时的 XStream ForbiddenClassException

    我最近将 optaplanner 版本从版本 7 0 0 升级到版本 7 4 1 我使用在配置文件中声明的自定义 Forager 如下所示
  • Android 3d 动画,如 Google Now 启动器菜单动画

    我需要在这样的活动或片段之间制作动画 我用Android Api gt 14 http www youtube com watch v cNMqIv5Ocnk http www youtube com watch v cNMqIv5Ocnk
  • 通过 Web 保护文件:基于细粒度授权的文件访问

    我有一个员工可以上传文件的系统 有以下三种方式 以公共 私人或保护模式上传到我的帐户以公共 私人或保护模式上传至部门帐户以公共 私有或保护模式上传到组织帐户 其中公共对任何人都可见 私有仅对组或个人而言并且对组织中的任何人都受保护 组织的所
  • GNU sed、^ 和 $ 带有 |当第一个/最后一个字符匹配时

    当进行包含类似内容的替换时 如果第一个字符匹配 则 REGEXP 中的 sed 不匹配模式空间开头的空字符串 如果最后一个字符匹配 它也不匹配结尾 这是为什么 以下是一些使用的示例123作为输入 与 r选项 substitution exp
  • 二维矩阵中的范围更新和查询

    我没有场景 但问题就在这里 这简直让我发疯 有一个 nxn 布尔矩阵 最初所有元素均为 0 n 我不知道如何解决这个问题 任何帮助将不胜感激 显然每个查询的 O n 解决方案是不可行的 使用数字来排序修改的想法取自 Dukeling 的帖子
  • Chrome 80如何解码cookie

    我有一个用于打开和解密 Google Chrome cookie 的工作脚本 如下所示 decrypted win32crypt CryptUnprotectData enctypted cookie value None None Non
  • Facebook SDK 4.x 权限问题 iOS

    我想得到Feed用于登录用户的时间线 我有一个登录按钮 我向其传递读取权限 包括user posts 令人惊讶的是 Facebook 没有授予我此权限并且忽略了它 Code void viewDidLoad super viewDidLoa
  • Powershell计划任务“延迟任务”选项

    我需要使用 延迟任务 选项创建任务计划 1 分钟 我可以看到 PowerShell cmdlet New ScheduledTaskTrigger 有一个选项 RandomDelay 但我认为它无效 我在文档中也看不到其他选项 https
  • Android Javascript WebView

    我有一个应用程序 我的最小 API 是 16 我想在 Web 视图上评估一些 javascript 当我有 mWebView evaluateJavascript function 我收到一个编译错误 说这仅在 API 19 及更高版本中可
  • 如何在Jqgrid中显示间接数据

    我正在我的 ASP net MVC Web 应用程序中实现 Jqgrid 我有这样的数据 SID SNAME CITY 1 ABC 11 2 XYZ 12 3 ACX 13 4 KHG 14 5 ADF 15 6 KKR 16 和另一张桌子
  • 无法使用 getRef() 吗?

    谁能解释为什么这说我不能使用 getRef 来获取被单击的位置 从我查到的所有内容来看 这应该有效 但由于某种原因却无效 public class DeleteChoiceListFragment extends Fragment Data
  • Firebase:我可以使用 Facebook 的新 Account Kit 对应用用户进行身份验证吗?

    脸书刚刚推出账户套件 https developers facebook com products account kit2016年F8 它使应用程序用户可以使用电话号码或电子邮件地址登录 我已经尝试使用它返回的访问令牌来通过 Fireba
  • 如何设置调色板,使其从最暗的颜色开始,其中旧数据比当前数据浅

    我正在绘制相关散点图 其中我的数据框包含时间数据 并且起始年份是任意的 在这种情况下 现在我有以下内容R code Set seed for randomness in dummy data set seed 123 Create data
  • Hibernate、iBatis、Java EE 或其他 Java ORM 工具

    我们正在规划一个大型企业应用程序 在经历了 J2EE 的痛苦之后 我们将重点放在评估 hibernate 上 看起来新的 Java EE API 更简单 我还阅读了一些有关 Hibernate 和 iBatis 的好文章 我们的团队对任何框