2

我有 Websphere 7 服务器,它不支持 JPA 2.0。所以我不能在 WAS 7 JPA 2.0 应用程序上运行。

但我想知道 Spring 用户如何在 Tomcat 或 Jetty 上运行 Hibernate?这个 servlet 容器(如 WAS 7)也不支持 Java EE 6。

所以这意味着我可以在 WAS 7 上运行 Hibernate 并获得与在 Tomcat 或 Jetty 上相同的结果?.

如果是,为 JPA 使用应用服务器有什么好处?为什么所有开发人员都不使用 servlet-containers 而不是 app-servers?

我还听说过“容器管理”的东西,它允许一些额外的特性和功能。所以这意味着许多开发人员(在 Jetty 和 Tomcat 上使用 Spring)没有从使用应用服务器的容器管理功能中获益?

PS 我知道Feature Pack用于支持 JPA 2.0 的 WAS 7 的可用补丁,但不要质疑它。

4

4 回答 4

5

您可以通过在您的 WEB-INF/lib 文件夹中包含适当的 jar 来引入很多功能,但是 servlet 容器无法以任何方式帮助您实现这些功能,而且它很可能实际上无法很好地与功能集成由容器提供。一个典型的例子是引入您自己的 JSF 2.0 库。

在容器中使用实现的真正优势在于,容器可以帮助跨多个主机进行集群,提供 JDBC 连接池等。

因此,在包含例如 Hibernate 时,您需要更加小心,并在您自己的部署中进行所有配置,但可以这样做。

于 2012-12-25T13:04:27.487 回答
3

您也可以问一个完全相反的问题:“为什么在 JPA 2 中使用裸 servlet 容器,因为它包含在所有 Java EE 6 服务器中?”。

基本上它归结为:

  • 有一个轻量级的容器,然后有一个繁重的应用程序(Spring 方式),
  • 有一个轻量级的应用程序,然后是一个重的容器(Java EE 6 方式)。

经过多年的发展,使用 Spring 和 Java EE 6 构建应用程序的模型已经趋于一致,有时您无法仅通过查看一个类来判断它是 Spring 还是 CDI bean。所以真正的区别主要在于配置。

于 2012-12-25T13:05:28.840 回答
2

应用程序服务器提供一组“开箱即用”的服务,因此如果提供的服务是您需要的服务,它们会更容易使用。你只需打包和部署你的应用程序,事情就可以工作了。此外,大多数技术都是由应用程序服务器实例化的,因此可以避免很多类加载器问题。

应用服务器的问题在于,有时(实际上经常如此),您需要挑选与应用服务器提供的不兼容的特定框架、服务等的特定版本。在这些情况下,您通常需要摆弄应用程序服务器,并且在某些情况下,您想要做的事情甚至可能无法使用您的应用程序服务器。

例如,Weblogic 10.x 是一个 Java EE 5 应用服务器,所以它默认提供 JSF 1.2 和 JPA 1。如果你想使用更新的东西,你需要手动部署一些额外的库(JSF 2.0),或者补丁服务器(JPA 2.0)。

另一个例子:在 Glassfish 3.1 中,我无法使用 Tomcat EL 而不是 Glassfish EL。Tomcat EL 支持可变参数方法调用,而 Glassfish EL 不支持。

Java EE 应用程序服务器的刚性使得很多人更喜欢为独立的 servlet 容器(如 Tomcat 或 Jetty)开发,在这些容器中除了 Servlet 和 JSP API 之外没有任何开箱即用的东西,但您可以手动将所有内容放入其中。您还可以将其与您的应用程序一起打包,这样在开发时会更舒服,但如果您为每个容器部署多个应用程序,则会给您带来问题(资源浪费、类加载问题、类加载器泄漏……)

更新:

与在 Java EE 容器中使用 JPA 相比,在 SE 环境(例如 Tomcat)中使用 JPA存在一些差异。基本上:

  • 您必须手动管理EntityManagerFactoryEntityManager实例。
  • Tomcat 不进行注入,因此@PersistenceContext注解和类似的注解不起作用。

请注意,某些容器(例如 Spring)可以配置为隐藏这些细节,因此您可以像在 Java EE 容器中一样工作。

阅读JPA 规范,了解在 SE 环境而不是 EE 环境中运行的详细信息。

关于其他库,通常您会发现一些细微差别。例如,JAX-WS 需要为您的 web 应用程序注册一个 servlet 和一个侦听器,但其他任何东西都应该相同。通常,您可以搜索文档以获取有关如何在独立 servlet 容器中运行事物的说明。

于 2012-12-25T15:04:34.040 回答
0

WAS 7.0 有一个 JPA 2.0 功能包,它可能会对您有所帮助。

于 2012-12-25T23:47:08.030 回答