我知道JPA 2是一个规范,Hibernate是ORM的工具。另外,我知道Hibernate比JPA 2有更多的特性。但从实际的角度来看,两者到底有什么区别呢?

我有使用iBatis的经验,现在我正在尝试学习Hibernate或JPA2。我拿起Pro JPA2书,它一直提到“JPA提供商”。例如:

如果你认为一个特性应该标准化,你应该说出来 并向您的JPA提供者请求它

这让我很困惑,所以我有几个问题:

仅使用JPA2,我可以通过简单地注释POJO从DB中获取数据 JPA2应该与“JPA提供者”一起使用吗?例如TopLink或Hibernate?如果是这样,那么与单独使用JPA2或单独使用Hibernate相比,使用JPA2 + Hibernate有什么好处? 你能推荐一本好的实用的JPA2书吗?“Pro JPA2”看起来更像是JPA2的圣经和参考书(直到本书的后半部分才进入查询)。有没有关于JPA2的问题/解决方法的书?


当前回答

正如您所说,JPA只是一个规范,这意味着没有实现。您可以尽可能多地使用JPA注释注释您的类,但是如果没有实现,什么也不会发生。将JPA视为必须遵循的指导方针或接口,而Hibernate的JPA实现是满足JPA规范定义的API并提供底层功能的代码。

当您将Hibernate与JPA一起使用时,您实际上是在使用Hibernate JPA实现。这样做的好处是,您可以将Hibernate的JPA实现替换为JPA规范的另一个实现。当你直接使用Hibernate时,你锁定在实现中,因为其他ORM可能使用不同的方法/配置和注释,因此你不能直接切换到另一个ORM。

要了解更详细的描述,请阅读我的博客。

其他回答

JPA是一个API,由Hibernate实现。Hibernate先于JPA。在JPA之前,您编写本地hibernate代码来执行ORM。JPA只是一个接口,所以现在编写JPA代码并需要找到一个实现。Hibernate恰好是一个实现。

你的选择是这样的: Hibernate, toplink等等…

JPA的优点是它允许您在需要时交换您的实现。缺点是本机hibernate/toplink/等…API可能提供JPA规范不支持的功能。

正如您所说,JPA只是一个规范,这意味着没有实现。您可以尽可能多地使用JPA注释注释您的类,但是如果没有实现,什么也不会发生。将JPA视为必须遵循的指导方针或接口,而Hibernate的JPA实现是满足JPA规范定义的API并提供底层功能的代码。

当您将Hibernate与JPA一起使用时,您实际上是在使用Hibernate JPA实现。这样做的好处是,您可以将Hibernate的JPA实现替换为JPA规范的另一个实现。当你直接使用Hibernate时,你锁定在实现中,因为其他ORM可能使用不同的方法/配置和注释,因此你不能直接切换到另一个ORM。

要了解更详细的描述,请阅读我的博客。

我尽量用简单的话解释。

假设你需要一辆车,我们都知道他们有几个a级制造商,如梅赛德斯,宝马,奥迪等。

现在在上面的声明中,CAR(是一种规格),因为每辆车都有共同的特征,比如有四个轮子的东西,可以在道路上行驶。所以它像JPA。 奔驰、宝马、奥迪等只是使用常见的汽车功能,并根据他们的客户基础添加功能,所以他们正在实现汽车规范,如hibernate、iBATIS等。

因此,通过这个通用特性,jpa和hibernate只是一个实现,根据他们的jboss的需要。

还有一件事

JPA包括一些基本属性,所以在未来,如果你想改变hibernate到任何其他实现,你可以很容易地切换,而不需要太多的头痛,这些基本属性包括JPA注释,可以工作于任何实现技术,JPQL查询。

因此,我们主要使用JPA类型技术实现hibernate,只是为了以防万一我们想根据客户需要切换我们的实现,加上您将编写更少的代码,因为JPA中涉及一些常见的特性。 如果有人仍然不清楚,那么你可以评论,因为我是新的堆栈溢出。

谢谢你!

JPA是一个Java API规范,它描述了使用Java平台管理应用程序中的关系数据。其中Hibernate是一个ORM(对象关系映射)库,遵循JPA规范。

您可以将JPA看作是由Hibernate实现的一组规则。

JPA是规范,Hibernate是遵循规范中规定的规则的实现提供者。