我应该使用哪个EJB 3持久提供程序?
我在一个相当大的J2EE项目上使用EJB 3,默认情况下,Netbeans将实体bean的持久提供程序设置为TopLink。可以选择将提供程序更改为以下之一,甚至添加新的持久性库:
- 冬眠
- KODO
- OpenJPA
我们更喜欢使用哪个持久性提供程序?使用其他提供商的好处是什么?
尽管TopLink看起来不错,但是我找不到关于如何控制缓存等的大量文档。任何帮助将不胜感激。
解决方案
出于以下原因,我强烈建议我们使用Hibernate:
- Java世界中使用最广泛且受人尊敬的开源持久层;庞大的活跃社区以及在大量关键任务应用中的大量使用。
- 如果我们希望与其余应用程序(例如Spring等)走一条不同的路,那么我们根本就不会与J2EE或者特定的供应商建立联系,因为Hibernate仍然可以很好地发挥作用。
我发现Hibernate的文档非常详尽,并且得到了各种缓存技术的大力支持。在非JPA的环境中,我也比其他人使用了更多的东西,因此也许我对此有些偏见。
我使用TopLink Essentials尝试的几个小玩具项目也能很好地完成工作,但是我从未涉足缓存或者任何需要提供商特定文档的项目。总的来说,我认为社区对此的支持较少,这就是为什么我最终使用Hibernate的一部分。
我使用休眠模式。它已经非常成熟,并且效果很好。我个人没有使用过其他任何工具,但是我确实知道Hibernate是目前功能最全的JPA提供程序之一。同样因为有这么多人在使用它,几乎我遇到的每个问题,我都可以通过一点点搜索来快速找到解决方案。
我只考虑使用两个JPA提供程序:
如果我们要坚持标准的JPA,我将使用EclipseLink。 Toplink Essentials是JPA 1.0的参考实现,而EclipseLink基本上继承了TopLink Essentials代码,并且将是JPA 2.0(与Glassfish V3捆绑在一起;预计于2009年5月在JavaOne中提供)的参考实现。 TopLink Essentials是Oracle商业TopLink产品的一个残缺版本,但是EclipseLink基本上具有TopLink的所有功能。
另一个选择显然是休眠。它已被广泛使用和成熟,但并非不是我所见过的问题。例如,上次我看到Hibernate对于具有多个一对多渴望关系的实体存在问题。我不知道Hibernate是否具有与EclipseLink的批处理查询提示等效的功能,但是它是处理此类问题的非常有用的功能。
Hibernate当然也支持标准的JPA。 Hibernate的最大优点是,如果我们对它的工作方式有疑问,那么Google搜索很可能会为我们找到答案。
老实说,除了以上两个提供商之外,我不会考虑其他任何事情。
我最近研究了使用Kodo JPA框架构建的大型企业应用程序。 Kodo生成的SQL通常不能很好地扩展以处理大量数据。在我看来,它使用外部联接产生了太多查询。考虑到在尝试缩放Kodo时必须更改多少个映射,我不建议将其用于大型企业应用程序。甚至我们与之交谈的Oracle代表都试图将客户从Kodo撤至TopLink。甲骨文未来可能会逐步淘汰kodo。
DataNucleus http://www.datanucleus.org还是完全兼容的JPA提供程序,具有JPA1和一些JPA2预览功能