我有一个100%兼容JPA2的应用程序,需要可移植到许多应用程序服务器。符合JPA(理论上)意味着我们可以通过配置切换JPA提供程序(例如,不更改源代码) - (正确???)。
在servlet容器(例如Tomcat,Jetty)中运行时,应用程序配置为使用Hibernate运行。我们选择Hibernate而不是TopLink和Eclipselink来实现其成熟度和性能。到目前为止,这是有效的。
但是,在Java EE应用程序服务器中运行时,我们应该默认使用JPA提供程序,还是坚持使用Hibernate?
我知道在JBoss中,提供者是Hibernate所以它可能并不重要。但是,我认为 WebLogic中的提供程序是Eclipselink。我不知道提供者WebSphere或Glassfish使用了什么,但我已经看到了有关如何将Hibernate用作这些应用程序服务器中的提供程序的详细说明。
我想另一种问这个问题的方法是在这些应用服务器中使用Hibernate会缺少什么?
答案 0 :(得分: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提供程序。请参阅this thread和this page。但这并没有得到官方的支持,而Hibernate 3.5的同样做法可能是another story。
在WebSphere 6和7中,默认提供程序是OpenJPA。 This link将为您提供有关更改默认提供程序(以及后果)的方法的一些详细信息。但我不能告诉你更多。
我想另一种问这个问题的方法是在这些应用服务器中使用Hibernate会缺少什么?
正如我所提到的,供应商可能不支持此功能。此外,如果您希望最大限度地提高可移植性并计划在不久的将来部署您的应用程序,那么选择JPA 2.0可能不是明智的选择(如果您愿意,也可能过于乐观)。
答案 1 :(得分:2)
除非您在JPA代码中使用特定于实现的API,否则我不会看到您将丢失的内容。即请勿在JPA代码中的任何位置import org.hibernate
,而只是根据JPA API编写它。