4

我有一个 100% 兼容 JPA2 的应用程序,它需要可移植到许多应用程序服务器。符合 JPA(理论上)意味着我们可以通过配置切换 JPA 提供程序(例如,无需更改源代码)——(对吗???)。

当在 servlet 容器(例如 Tomcat、Jetty)中运行时,应用程序被配置为使用 Hibernate 运行。我们选择 Hibernate 而不是 TopLink 和 Eclipselink 是因为它的成熟度和性能。到目前为止,这有效。

但是,当在 Java EE 应用程序服务器中运行时,我们应该默认使用其中的 JPA 提供程序,还是坚持使用 Hibernate?

我知道在 JBoss 中,提供者是 Hibernate,所以它可能无关紧要。但是,我认为WebLogic 中的提供者是 Eclipselink。我不知道提供者 WebSphere 或 Glassfish 使用什么,但我看到了有关如何在这些应用程序服务器中使用 Hibernate 作为提供者的详细说明。

我想问这个问题的另一种方式是在这些应用程序服务器中使用 Hibernate 会丢失什么?

4

2 回答 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(尚未发布)中,EclipseLink 2.0将作为 WLS 模块提供,默认仍然是 OpenJPA/Kodo。但是,容器 JPA API 仍然是 JPA 1.0!似乎可以在您的应用程序中打包一个 JPA 2.0 提供程序。请参阅此线程此页面。但这并没有得到官方的支持,并且对 Hibernate 3.5 做同样的事情可能是另一回事

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

我想问这个问题的另一种方式是在这些应用程序服务器中使用 Hibernate 会丢失什么?

正如我所提到的,这可能不受供应商的支持。此外,如果您想最大限度地提高可移植性并计划在不久的将来部署您的应用程序,那么选择 JPA 2.0 可能不是一个明智的选择(如果您愿意,也可能过于乐观)。

于 2010-06-08T19:43:59.630 回答
2

除非您在 JPA 代码中使用特定于实现的 API,否则我看不出您会丢失什么。即不要import org.hibernate在您的 JPA 代码中的任何地方,而只是针对 JPA API 编写它。

于 2010-06-08T14:58:33.623 回答