- java/
- Hibernate、iBatis、JavaEE或其他JavaORM工具
Hibernate、iBatis、JavaEE或其他JavaORM工具
Hibernate、iBatis、JavaEE或其他JavaORM工具,java,hibernate,orm,jakarta-ee,ibatis,Java,Hibernate,Orm,Jakarta Ee,Ibatis,我们正在规划一个大型企业应用程序。在经历了J2EE的痛苦之后,我们将重点放在评估hibernate上
看起来新的JavaEEAPI更简单。我也读了一些关于Hibernate和iBatis的好东西。我们的团队对任何框架都缺乏经验
我想确定5个主要的比较点
学习曲线/易用性
生产力
可维护性/稳定性
性能/可扩展性
易于排除故障
如果您要管理一个由6名具有J2EE经验的开发人员组成的团队,您会使用哪种ORM工具以及为什么使用它?iBatis和Hibernate之间的一个简单的经验法则是,如果您想
我们正在规划一个大型企业应用程序。在经历了J2EE的痛苦之后,我们将重点放在评估hibernate上
看起来新的JavaEEAPI更简单。我也读了一些关于Hibernate和iBatis的好东西。我们的团队对任何框架都缺乏经验
我想确定5个主要的比较点
- 学习曲线/易用性
- 生产力
- 可维护性/稳定性
- 性能/可扩展性
- 易于排除故障
如果您要管理一个由6名具有J2EE经验的开发人员组成的团队,您会使用哪种ORM工具以及为什么使用它?iBatis和Hibernate之间的一个简单的经验法则是,如果您想要更多的SQL/关系世界视图,iBatis更适合您;对于更复杂的继承链,以及对SQL不太直接的查看,请使用Hibernate。
这两种方法都被广泛使用,而且都是很好的框架。所以我认为这两种方法可能都很有效。也许你可以阅读这两个方面的教程,看看其中一个听起来是否比另一个好,然后选择一个
在您列出的内容中,我认为性能并没有太大不同——瓶颈几乎总是数据库,而不是框架。对于其他方面,我认为不同的开发人员会选择其中之一,即没有公认的优先级(对于iBatis和Hibernate)。让我来分析一下。首先,我在年写了一些关于这个主题的文章。特别是为了解决您的问题:
学习曲线/易用性
Ibatis是关于SQL的。如果您知道SQL,那么ibatis的学习曲线是微不足道的。Ibatis在SQL之上执行一些操作,例如:
您仍然需要学习,但最大的障碍是SQL
另一方面,JPA(包括Hibernate)试图与SQL保持距离,并以对象而不是关系的方式呈现事物。然而,正如乔尔指出的,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,然后计算设置和调用的组合,以使其生成正确的SQL既正确又有效
Ibatis没有这种问题,因为SQL是您自己编写的。您可以通过在PL/SQL Developer、SQL Server Management Studio、Navicat for MySQL等内部运行SQL来测试它。查询正确后,您所做的就是映射输入和输出
我还发现JPA-QL比纯SQL更笨拙。您需要单独的工具来运行JPA-QL查询以查看结果,这是您需要了解的更多内容。事实上,我发现JPA的整个部分相当尴尬和笨拙,尽管有些人喜欢它
可维护性/稳定性
Ibatis的危险在于它的扩散,这意味着您的开发团队可能会在需要时不断添加值对象和查询,而不是寻求重用,而JPA每个表有一个entity,一旦您拥有了该实体,就可以了。命名查询往往位于该实体上,因此很难忽略。临时查询仍然可以重复,但我认为这不是一个潜在的问题
然而,这是以刚性为代价的。在应用程序中,通常需要来自不同表的数据位和数据段。使用SQL很容易,因为您可以编写一个查询(或少量查询)来一次性获取所有数据,并将其放入自定义值对象中
有了JPA,您就可以将这种逻辑提升到业务层。实体基本上是全部或无。这不是严格意义上的事实。各种JPA提供者将允许您部分加载实体等等,但即使在这里,您也在谈论相同的离散实体。如果需要来自4个表的数据,则需要4个实体,或者需要将所需的数据组合到业务层或表示层中的某种自定义值对象中
我喜欢ibatis的另一点是,所有SQL都是外部的(在XML文件中)。有人会说这是一个缺点,但我不会。然后,通过搜索XML文件,您可以相对轻松地找到表和/或列的用法。使用SQL