我们正在规划一款大型企业应用程序。在遭受J2EE痛苦的经历后,我们将精力集中在评估Hibernate上。
看起来新的Java EE API更简单。我也读到了一些关于Hibernate和iBatis的好东西。我们的团队对这些框架都缺乏经验。
我想确定以下5个主要比较点:
- 学习曲线/易用性
- 生产力
- 可维护性/稳定性
- 性能/可扩展性
- 故障诊断的易用性
如果您要管理一个有J2EE经验的6人开发团队,您会使用哪种ORM工具?为什么?
我们正在规划一款大型企业应用程序。在遭受J2EE痛苦的经历后,我们将精力集中在评估Hibernate上。
看起来新的Java EE API更简单。我也读到了一些关于Hibernate和iBatis的好东西。我们的团队对这些框架都缺乏经验。
我想确定以下5个主要比较点:
如果您要管理一个有J2EE经验的6人开发团队,您会使用哪种ORM工具?为什么?
可维护性/稳定性
Ibatis的危险在于过度扩张,这意味着你的开发团队可能会根据需要不断添加价值对象和查询,而不是寻找重复使用的机会。相比之下,JPA每个表只有一个实体,一旦拥有该实体,就可以将命名查询放在该实体上,因此很难错过。临时查询仍然可以重复,但我认为这不太可能成为问题。
然而,这是以刚性为代价的。通常,在应用程序中,您需要从不同的表中获取一些数据。对于SQL来说,这很容易,因为您可以编写单个查询(或少量查询)以一次性获取所有数据,并将其放入专门用于此目的的自定义值对象中。
使用JPA,您将该逻辑移动到业务层中。实体基本上是全套或不要。现在这并不严格正确。各种JPA提供程序都允许您部分加载实体等,但即使在那里,您也在谈论相同的离散实体。如果您需要来自4个表的数据,则需要4个实体,或者您需要将所需数据合并到业务或表示层中的某种自定义值对象中。
我喜欢ibatis的另一件事是所有SQL都是外部的(在XML文件中)。有些人会将此视为劣势,但我不会。然后,您可以通过搜索XML文件相对容易地找到表和/或列的用途。对于嵌入在代码中的SQL(或根本没有SQL的情况),可能会更难找到。您还可以将SQL剪切并粘贴到数据库工具中并运行它。多年来,我无法过多强调这有多少次对我有用。
性能/可扩展性
在这里,我认为ibatis毫无疑问是胜者。它是直接的SQL和低成本的。从其本质上讲,JPA简单地无法管理相同级别的延迟或吞吐量。现在,JPA的优势在于延迟和吞吐量只很少出现问题。然而,高性能系统确实存在,并且倾向于不利于像JPA这样更加重量级的解决方案。(针对第一个评论添加) 如果你足够幸运地重新设计数据库,并且要使用ORM,则有两个非常重要的考虑因素:
- 在所有相关表中添加版本号列以支持乐观锁定。
- 在数据分析期间,决定用于
hashCode()
和equals()
的非空 "替代键"列,开发人员不应在这些方法中使用PK列。
如果你确实有一个Greenfield项目,你可以使用Hibernate,但要注意学习曲线非常陡峭。
如果你有一个现有的数据库,那么使用iBatis会更好,因为一天后你就能投入生产,再过两天你就可以了解它的所有内容。
有一件事情需要考虑,那就是Hibernate Criteria API非常适合创建自定义查询,这可能是支持Hibernate的一个很好的理由,具体取决于你的应用程序。
我建议使用JPA,并且根据您的项目持续时间/范围,您也可以研究一下JPA2,因为它提供了JPA缺失的一些功能(例如非常好用的查询API)。