2010-02-24 64 views
3

我在哪里工作,坐在我对面的人正在开发一个项目。这是一个使用Struts,Spring,EJB 3.0,JPA和Hibernate 3.0的JavaEE应用程序。他们使用带注释的EJB 3.0实体bean。我一直在问他们为什么Hibernate 3.0在这个混合中,没有人能够告诉我。感觉就像他们已经包含Hibernate 3.0一样,因为他们被告知但并未将它用于EJB 3.0实体bean/JPA无法获取的任何内容。他们使用CMP并通过EJB访问所有数据库功能。使用Hibernate 3.0与EJB 3.0和JPA

Hibernate可以为您提供此设置中无法由EJB 3.0/JPA提供的任何内容吗?

+0

您使用的是什么应用程序服务器? – 2010-02-24 20:34:57

+0

@Chris Dail - 他们正在使用Websphere 6.1 – 2010-02-25 12:03:17

回答

2

JPA本身只是一个规范而不是产品,它本身不能执行持久化或其他任何事情。 JPA只是一组接口,需要实现(持久性提供者)。有开源和商业JPA实现(Toplink Essentials,EclipseLink,Hibernate EntityManager,OpenJPA,Kodo等)和任何Java EE 5(或Java EE 6)应用程序服务器必须为其提供支持(JBoss使用Hibernate EntityManager,GlassFish v2默认情况下使用Toplink Essentials,GlassFish v3默认使用EclipseLink,WebLogic默认使用Kodo等)。

现在,使用JPA的好处之一是它可以在容器之外使用,例如在Java SE应用程序或测试环境中(这是EJB 2.x的一个大问题)。但是在这种情况下,需要提供一个实现,因为你不会得到容器提供的那个。正如我们所看到的,Hibernate EntityManager--它建立在Hibernate Core之上 - 就是其中之一,这可以解释为什么你会看到它。

请注意,大多数(所有?)容器提供了一种方法来替换它们提供的默认实现。例如,可以使用Hibernate代替带Weblogic的Kodo,或使用GlassFish代替EclipseLink。这可能是你在混音中看到它的另一个原因。

4

Hibernate确实有一个JPA实现,但它也可以单独使用。在JavaEE中可以使用Hibernate作为持久性提供者。例如,JBoss应用程序服务器使用Hibernate来实现其持久性。因此,如果您使用Hibernate在应用程序服务器中提供持久性,则可能有意义。

如果您使用的是不使用Hibernate进行持久性应用程序服务器,那么您听起来可能不需要它。 Hibernate确实有一些扩展和JPA中没有的东西。许多其他持久性提供商也有这些扩展(如Toplink或Eclipselink)。检查你的应用程序服务器提供的信息,看看它们是否有你可能需要的扩展或类似于你在Hibernate中使用的扩展。