我最近评估并选择了一个 java 项目的持久性框架,我的发现如下:
我看到的是对JDO的支持主要是:
- 您可以使用非 sql 数据源、db4o、hbase、ldap、bigtable、couchdb(cassandra 插件)等。
- 您可以轻松地从 sql 数据源切换到非 sql 数据源,反之亦然。
- 没有代理对象,因此在 hashcode() 和 equals() 实现方面的痛苦更少
- 更多 POJO,因此需要更少的变通方法
- 支持更多的关系和字段类型
对JPA的支持主要是:
我看到很多来自 JPA 开发人员的支持 JPA 的帖子,他们显然没有使用过 JDO/Datanucleus,他们为不使用 JDO 提供了薄弱的论据。
我还看到很多来自 JDO 用户的帖子,他们已经迁移到 JDO 并且因此更快乐。
关于 JPA 更受欢迎,这似乎部分是由于 RDBMS 供应商的支持,而不是它在技术上的优势。(对我来说听起来像 VHS/Betamax)。
JDO 和它的参考实现 Datanucleus 显然没有死,正如 Google 将它用于 GAE 和源代码的积极开发 (http://sourceforge.net/projects/datanucleus/) 所示。
由于字节码增强,我看到了许多关于 JDO 的投诉,但还没有解释为什么它不好。
事实上,在一个越来越痴迷于 NoSQL 解决方案的世界中,JDO(和 datanucleus 实现)似乎是一个更安全的选择。
我刚刚开始使用 JDO/Datanucleus 并对其进行了设置,以便我可以在使用 db4o 和 mysql 之间轻松切换。使用 db4o 有助于快速开发,而不必过多担心 DB 模式,然后,一旦模式稳定,就可以部署到数据库。我也有信心,以后,我可以将我的全部/部分应用程序部署到 GAE 或利用分布式存储/map-reduce a la hbase /hadoop / cassandra,而无需进行太多重构。
我发现开始使用 Datanucleus 的最初障碍有点棘手——datanucleus 网站上的文档有点难以理解——教程并不像我希望的那样容易理解。话虽如此,一旦您越过了最初的学习曲线,关于 API 和映射的更详细的文档就会非常好。
答案是,这取决于你想要什么。我宁愿拥有更简洁的代码、无供应商锁定、更面向 pojo、nosql 选项而不是更受欢迎的选项。
如果您想要和大多数其他开发人员/绵羊一样的温暖挑剔感觉,请选择 JPA/hibernate。如果您想在您的领域中处于领先地位,请试用 JDO/Datanucleus 并做出自己的决定。