Java 结合EJB3.0使用Hibernate3.0&;JPA

Java 结合EJB3.0使用Hibernate3.0&;JPA,java,hibernate,orm,jpa,Java,Hibernate,Orm,Jpa,我工作的地方坐在我对面的人正在做一个项目。这是一个JavaEE应用程序,它使用Struts、Spring、EJB3.0、JPA和Hibernate3.0。他们正在使用带有注释的EJB3.0实体bean。我一直在问他们为什么Hibernate3.0会出现在这个组合中,似乎没有人能告诉我。感觉他们已经包括了Hibernate3.0,因为他们被告知要这样做,但没有将它用于任何他们无法从EJB3.0实体bean/JPA获得的东西。他们使用CMP并通过EJB访问所有数据库功能 Hibernate在这个设置

我工作的地方坐在我对面的人正在做一个项目。这是一个JavaEE应用程序,它使用Struts、Spring、EJB3.0、JPA和Hibernate3.0。他们正在使用带有注释的EJB3.0实体bean。我一直在问他们为什么Hibernate3.0会出现在这个组合中,似乎没有人能告诉我。感觉他们已经包括了Hibernate3.0,因为他们被告知要这样做,但没有将它用于任何他们无法从EJB3.0实体bean/JPA获得的东西。他们使用CMP并通过EJB访问所有数据库功能


Hibernate在这个设置中能提供EJB3.0/JPA无法提供的任何东西吗?

Hibernate有一个JPA实现,但也可以单独使用。在JavaEE中,可以使用Hibernate作为持久性提供者。例如,JBoss应用服务器使用Hibernate进行持久化。因此,如果您使用Hibernate在应用服务器中提供持久性,这可能是有意义的


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

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等)1

现在,JPA的一个优点是它可以在容器外部使用,例如在JavaSE应用程序或测试上下文中(这是EJB2.x的一个大问题).但在这种情况下,您需要提供一个实现,因为您无法获得容器提供的实现。正如我们所看到的,Hibernate EntityManager(构建在Hibernate Core之上)就是其中之一,这可能解释了为什么您会看到它


请注意,大多数(全部?)容器提供了一种替换它们提供的默认实现的方法。例如,可以使用Hibernate而不是Weblogic的Kodo,或者使用GlassFish的EclipseLink。这可能是您在混合中看到它的另一个原因。

您使用的是什么应用程序服务器?@Chris Dail-他们使用的是Websphere 6.1