使用Hibernate 3.0与EJB 3.0和JPA

3
我所在的工作环境中,坐在我对面的人正在开发一个项目。这是一个JavaEE应用程序,使用了Struts、Spring、EJB 3.0、JPA和Hibernate 3.0。他们正在使用带有注释的EJB 3.0实体bean。我一直在问他们为什么要在这个混合体中加入Hibernate 3.0,但没有人能告诉我。感觉他们加入Hibernate 3.0只是因为被告知要这样做,但并没有使用它来获取任何不能从EJB 3.0实体bean/JPA中获得的东西。他们正在使用CMP,并通过EJBs访问所有的数据库功能。
在这种设置下,Hibernate能够提供比EJB 3.0/JPA更多的吗?

你正在使用哪个应用服务器? - Chris Dail
@Chris Dail - 他们正在使用Websphere 6.1。 - SOA Nerd
2个回答

4
Hibernate有一个JPA实现,但它也可以独立使用。可以在JavaEE中使用Hibernate作为持久性提供者。例如,JBoss应用服务器使用Hibernate进行持久化。因此,如果您正在使用Hibernate来提供应用服务器中的持久性,则可能是有意义的。
如果您使用的应用服务器不使用Hibernate进行持久化,那么听起来您可能不需要它。 Hibernate确实具有一些扩展和JPA中不可用的功能。许多其他持久性提供程序也具有这些扩展(如Toplink或Eclipselink)。请向您的应用服务器提供者查询,了解他们是否具有您可能需要的扩展或类似于Hibernate中所使用的东西。

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 Core之上的Hibernate EntityManager就是其中之一,这可能解释了为什么您会看到它。请注意,大多数(所有?)容器都提供了一种替换它们提供的默认实现的方法。例如,可以在Weblogic中使用Hibernate而不是Kodo,在GlassFish中使用Hibernate而不是EclipseLink。这可能是您在混合中看到它的另一个原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接