你是否应该默认使用应用服务器的JPA提供程序?

4
我有一个完全符合JPA2标准的应用程序,需要在许多应用程序服务器上进行移植。理论上,JPA兼容意味着我们可以通过配置(例如,不更改源代码)切换JPA提供程序--(对吗?)。当在servlet容器(例如Tomcat、Jetty)中运行时,应用程序被配置为使用Hibernate运行。我们选择Hibernate而不是TopLink和Eclipselink,是因为它成熟且性能好。到目前为止,这个方法可行。
然而,在Java EE应用程序服务器中运行时,我们应该默认使用其中的JPA提供程序,还是坚持使用Hibernate?
我知道在JBoss中,提供程序是Hibernate,所以可能无关紧要。但是,我认为WebLogic中的提供程序是Eclipselink。我不知道WebSphere或Glassfish使用什么提供程序,但我已经看到了如何在这些应用程序服务器中使用Hibernate作为提供程序的详细说明。
我想问的另一种方式是,在这些应用程序服务器中使用Hibernate会失去什么?

1
Glassfish使用EclipseLink(以前称为TopLink)作为JPA参考实现。 - BalusC
2个回答

4
我有一个100%符合JPA2标准的应用程序,需要在许多应用服务器上进行移植。符合JPA标准(...)意味着我们可以通过配置切换JPA提供程序(...)
是的。
然而,当在Java EE应用服务器中运行时,我们应该默认使用其中的JPA提供程序,还是坚持使用Hibernate?
嗯,如果您部署在Java EE 6服务器上,这并不重要。不清楚谁将运行应用程序,您可能可以提出建议,但实际上运行时“与你无关”:) 还要注意,如果不使用默认提供程序,则可能无法获得支持(如果这很重要)。
我知道在JBoss中,提供程序是Hibernate,所以这可能并不重要。但是,我认为WebLogic中的提供程序是Eclipselink。我不知道WebSphere或Glassfish使用什么提供程序,但我已经看到了如何在这些应用服务器中使用Hibernate作为提供程序的详细说明。
首先要记住,JPA 2.0 是 Java EE 6 的一部分,而 GlassFish v3 是目前唯一的 Java EE 6 容器。WebLogic 和 WebSphere 是 Java EE 5 服务器,可能不支持 JPA 2.0。
现在,关于默认提供程序:
  • GlassFish v3使用EclipseLink 2.0作为默认提供程序,但可以配置为使用Hibernate 3.5(通过插件)。

  • 在Weblogic 10.3.2中,默认的JPA提供程序是OpenJPA/Kodo,而EclipseLink 1.2可用作WLS模块。在WLS 10.3.3中(尚未发布),EclipseLink2.0将作为WLS模块提供,但默认仍为OpenJPA/Kodo。但是,容器JPA API仍将是JPA 1.0!似乎可以将JPA 2.0提供程序打包到应用程序中。请参见this threadthis page。但这不受官方支持,使用Hibernate 3.5进行相同操作可能会是另一种情况

  • 在WebSphere 6和7中,默认提供程序是OpenJPA。此链接将为您提供有关更改默认提供程序(以及其后果)的一些详细信息。但我不能告诉您更多。

我想换种方式问这个问题,如果我们在这些应用服务器中使用Hibernate会错过什么?

正如我所提到的,厂商可能不支持此功能。此外,如果您想要最大程度的可移植性并计划在不久的将来部署应用程序,则选择JPA 2.0可能不是明智的选择(或者如果您愿意,太乐观了)。


感谢您提供详细的答案。就此而言,看起来Websphere 7的JPA2现在已经可用:http://webspherecommunity.blogspot.com/2010/06/osgi-applications-and-jpa2-feature-pack.html然而,这将何时落入生产客户手中还是个未知数。 - Dave
WebSphere 8支持JEE6和JPA2。 - Archimedes Trajano

2

我认为你不会错过什么,除非你在JPA代码中使用特定于实现的API。也就是说,在JPA代码中不要import org.hibernate,而只需针对JPA API编写代码。


那么你的意思是在Websphere、Glassfish等环境中继续使用Hibernate? - Dave
1
我会让客户端/服务器管理员提供他们自己选择的JPA实现,而不是硬塞一个特定的实现给他们。 - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接