写点什么

JPA 框架比较

  • 2008-01-16
  • 本文字数:1745 字

    阅读完需:约 6 分钟

java.net 刊登了一篇由 Sharad Acharya 所写的名为 Java Persistence Framework: Which, When, and What? 的文章,文中比较了四种流行的持久化框架:CMP Entity EJBs、JPA、Hibernate 和 TopLink。Acharya 讨论了每种技术并在一个表格中总结了他的结论,其结论归结为:

JPA
适合 J2SE 和 J2EE 的简单框架,并入了其他框架的许多有用特性,但是需要 Java 5 或更高版。

CMP Entity EJBs
J2EE 容器所支持的框架,拥有安全和事务管理、很好的可伸缩性、以及分布式的组件能力,但是耗费资源且学习和使用较为复杂。

Hibernate
简单、灵活的框架,完全免费且易于与其他框架集成,但由于是开源的,因而可能有支持问题。

TopLink

Oracle 的中心框架,十分成熟,但是使用它意味着绑死在一个单一厂商上。

该文章引发了相当数量的评论,尤其是围绕着 JPA 和 EJB 3.0 中的 Entity Beans 之间的关系、以及作为开源框架的 Hibernate 的潜在不利因素方面的评论。

一个评论者在其关于 Entity Beans 和 JPA 的评论中这样写道:

该文章讨论了使用 JDBC 的 Bean-Managed Persistence (BMP) 与 Container-Managed Persistence 之间的对比,但是 EJB3.0 为实体 bean 持久化引入了一个全新的模型。我必须假设作者在这里讨论的是 EJB 2.x。

“远程接口模型”的讨论也暗示了作者仍然在谈论 EJB 2.x,而且他文章中的大部分针对 Enterprise JavaBean 的背景信息及所罗列的缺点实际上是对 EJB 1.x 和 EJB 2.x 而言的,而非针对 EJB 3.0。

这有点混乱,因为作者提及了 EJB 3.0 使用注解消除了许多伴随在以前版本 EJB 左右的编码困难。但是在下一个句子里他接着说道,“EJB 架构的学习和使用绝非易事”,并且罗列了一些以前 EJB 版本的一些常见问题。

作者还谈到了 EJB 在其他框架中不能使用,但是 EJB 3.0 使用了“普通”Java 类,它可以在其它框架中使用,只要这些框架忽略掉该普通 Java 类的 JPA 注解即可。

JPA 作为 EJB 3 规范的一部分被创建,而且是 EJB 3 的固有部分。该规范制定者确定符合 JPA 规范的实现应当支持 SE 环境。该作者提到了 JPA 在 EJB 和 SE 环境下都可以工作,但是接着又说要使用 JPA,Java EE 5 是必须的。这不是事实,因为要使 JPA 工作,SE 并不需要依赖于 EE。

该篇文章所罗列的 JPA 的一个“不利因素”是 JPA 的能力受限于实现厂商。事实是“厂商”必须实现所有规范要求,包括 Hibernate(它也是一个 JPA 实现的“厂商”)。有些人可能不得不自己写类库或框架,唯一的问题是他们所写的类库或框架是否与标准兼容。而其他一些人所涵盖的框架“可能”是基于标准的(构建在标准之上),Java 对象关系映射持久化框架自身就是标准,它是一套 Java 持久化 API。

EJB 3.0 和 JPA 之间是单向依赖。任何 EJB 3.0 实现应当被预期为是大量基于 JPA 的,但是 JPA 出现并不意味着 EJB 必须出现,因为 Java SE 可以使用 JPA。

另一个抱怨把开源作为一个不利因素的描述如下:

我认为我不同意你关于“开源是不利因素”的直白叙述。实际上,这种论调具有一定的误导,它实际上可能会给你的项目增加不利因素。我所工作的一个项目决定用 Kodo 替代 Hibernate,仅仅因为 LGPL 还不够友好(不利因素,等等)。当我看了代码之后我发现这是多么错误的一个决定……Hibernate 那时远远胜出而且现在我仍然这么看。现在维护起来困难且棘手。工作量完全不一样……

尽管如此,有些人还是插话表达对作者主张的支持:

开源项目通常“是”一个不利因素,而且 Hibernate 确实有严重的支持问题。除非你向该组织付费,否则你将发现他们的支持非常糟糕。Bug 报告和特性要求将伴以粗陋的评论而被关闭掉。张贴在论坛上的讨论会被忽略。普通(免费)支持将来也会很困难。任何正在考虑使用 Hibernate 的人应该认识到,90% 的时间它会像魔法一样在工作,但是你将会浪费“数以天计”的时间修改那剩下的 10%。他们通过使产品更难使用和掌控支持来获利,这是他们挣钱的方式,就像其他开源项目一样。

Hibernate 最大的易用性问题是其异常消息。有时你会得到一个误导性的错误信息,把你引向一个错误的方向。还有时你会得到非常模糊的信息,让你无法判断什么地方出了错。如果你提出一个 RFE,要求他们改善错误报告,你将会得到一个粗陋的评论,而且这个 RFE 将迅速被关闭。这只是我的个人看法。

查看英文原文: JPA Frameworks Compared

2008-01-16 01:3917208
用户头像

发布了 150 篇内容, 共 46.8 次阅读, 收获喜欢 10 次。

关注

评论

发布
暂无评论
发现更多内容

Git使用教程:最详细、最傻瓜、最浅显、真正手把手教!

程序员生活志

git

优质单元测试的十大标准,你有遵循吗?

禅道项目管理

项目管理 单元测试 自动化测试

好玩又好用,一款轻松就可以实现音视频的Demo

anyRTC开发者

音视频 移动互联网 RTC anyRTC Demo

国家央行数字货币的优势与挑战

CECBC

数字货币 央行 商业银行

PIP的报错Could not fetch URL https://pypi.org/

陈磊@Criss

Docker 容器连接

陈磊@Criss

Docker的Image

陈磊@Criss

Docker的Image

陈磊@Criss

Java的Override和Overload

陈磊@Criss

Kafka实战宝典:一文带解决Kafka常见故障处理

数据社

kafka 监控

你还应该知道的哈希冲突解决策略

vivo互联网技术

哈希冲突

分布式定时任务调度框架实践

vivo互联网技术

大数据 分布式 框架

jmeter 执行python脚本

陈磊@Criss

微信小程序的自动化测试框架

陈磊@Criss

国内程序员最容易发音错误的单词集合

程序员生活志

程序员 经验总结

华章25周年活动——《迁移学习》限量5折!

华章IT

Python的Twisted事件驱动的网络引擎框架

陈磊@Criss

告别下载速度慢!Docker配置阿里云镜像仓库

程序员的时光

Docker 阿里云

聊聊微前端的原理和实践

vivo互联网技术

大前端

Git删除仓库中的文件和文件夹

陈磊@Criss

DockerFile 详解

陈磊@Criss

人人都可以掌握的正交试验设计测试用例方法

陈磊@Criss

一文道尽“表驱动法”

架构精进之路

编码 表驱动法

最受欢迎的男友职业排行榜Top10

程序员生活志

程序员

Nginx的容器部署

陈磊@Criss

快速掌握的测试用例优先级划分方法

陈磊@Criss

pipreqs:生成python项目的requirements

陈磊@Criss

企业微信群消息机器人发送开源项目

陈磊@Criss

Kafka实战宝典:如何跨机房传输数据

数据社

大数据 kafka 跨机房

该了解一波了!零基础入门Nginx

程序员的时光

nginx Docker

如何选择一个性能测试工具(LoadRunner和Locust的一次对比)

陈磊@Criss

JPA框架比较_Java_James Kao_InfoQ精选文章