我最近为一个Java项目评估并选择了一个持久化框架,我的研究结果如下:
我所看到的支持JDO的主要原因是:
- 您可以使用非SQL数据源,例如db4o、hbase、ldap、bigtable、couchdb(用于cassandra的插件)等。
- 您可以轻松地在SQL和非SQL数据源之间切换。
- 没有代理对象,因此与hashcode()和equals()实现相关的麻烦较少。
- 更多POJO,因此需要较少的解决方法。
- 支持更多关系和字段类型。
而支持JPA的主要原因是:
我发现很多JPA开发人员撰写的文章都是偏向JPA的,他们清楚地没有使用过JDO/Datanucleus,并提出了不使用JDO的薄弱论点。
我还看到很多从JDO用户迁移到JPA后感觉更加满意的文章。
关于JPA更受欢迎,似乎部分原因是由于关系数据库管理系统供应商的支持,而不是它在技术上更加优越。(听起来像VHS/Betamax之争)
JDO及其参考实现Datanucleus显然并没有死亡,谷歌采用了它作为GAE的持久化框架,并对源代码进行了积极开发(http://sourceforge.net/projects/datanucleus/)。
我看到很多关于JDO的投诉,主要是由于字节码增强,但尚未解释为什么这样做是不好的。
事实上,在一个越来越着迷于NoSQL解决方案的世界中,JDO(和Datanucleus实现)似乎是一个更安全的选择。
我刚开始使用JDO/Datanucleus,并且已经设置好了可以轻松地在db4o和mysql之间切换。对于快速开发来说,使用db4o非常有帮助,不需要过多地担心数据库模式,一旦模式稳定下来,就可以部署到数据库中。我还有信心,在以后的时间里,能够将我的应用程序全部或部分部署到GAE,或利用分布式存储/map-reduce,例如hbase/hadoop/cassandra等,而不需要太多重构。
我发现最初开始使用Datanucleus有点棘手- Datanucleus网站上的文档不太容易入手- 教程不如我所希望的那样容易跟随。话虽如此,一旦你克服了最初的学习曲线,API和映射方面更详细的文档非常不错。
答案取决于你想要什么。我更喜欢更干净的代码,没有供应商锁定,更面向对象化的,与nosql选项相比更受欢迎。
如果你想获得与大多数其他开发人员/羊相同的温暖和融洽的感觉,请选择JPA/hibernate。如果你想在自己的领域中处于领先地位,请试用JDO/Datanucleus并自己做决定。