JPA和Hibernate有什么区别?

问题

我知道JPA 2是一个规范,Hibernate是ORM的工具。另外,我知道Hibernate比JPA 2有更多的功能。但从实际的角度来看,真正的区别是什么?

我有使用iBatis的经验,现在我正在尝试学习Hibernate或JPA2。我选了Pro JPA2书,它一直指的是“JPA提供者”。例如:

如果你认为某个功能应该标准化,你应该说出来并向你的JPA提供商索取

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

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

#1 热门回答(777 赞)

正如你所说,JPA只是一个规范,意味着没有实现。你可以使用JPA注释尽可能多地注释你的类,但是如果没有实现,则不会发生任何事情。将JPA视为必须遵循的准则或接口,而Hibernate的JPA实现是满足JPA规范定义的API并提供引擎功能的代码。

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

有关更详细的说明,请阅读myblog entry


#2 热门回答(634 赞)

JPA是舞蹈,Hibernate是舞者。


#3 热门回答(158 赞)

如果没有JCP的语言和理解的历史视角,有些事情难以理解。

通常会有第三方开发执行功能的软件包或填补不属于官方JDK的空白。由于各种原因,函数可能通过JCP(Java Community Process)成为Java JDK的一部分

Hibernate(2003年)提供了一种抽象SQL的方法,并允许开发人员在持久化对象(ORM)方面进行更多思考。你通知hibernate你的Entity对象,它会自动生成保留它们的策略。 Hibernate提供了一个执行此操作的实现,以及通过XML配置或注释来驱动实现的API。

现在的根本问题是你的代码与特定的供应商(Hibernate)紧密耦合,因为很多人认为应该更通用。因此需要通用的持久性API。

同时,来自Hibernate和其他ORM工具供应商的大量输入的JCP正在开发JSR 220(Java规范请求),这导致JPA 1.0(2006)和最终JSR 317,即JPA 2.0(2009)。这些是通用Java Persistence API的规范。 API在JDK中作为一组接口提供,这样你的类可以依赖于javax.persistence而不用担心正在执行持久化对象工作的特定供应商。这只是API,而不是实现。 Hibernate现在成为实现JPA 2.0规范的众多供应商之一。你可以编写JPA代码并选择符合你需求的兼容ORM供应商。

在某些情况下,Hibernate可能会为你提供未在JPA中编写的功能。在这种情况下,你可以选择直接在类中插入Hibernate特定注释,因为JPA不提供执行该操作的接口。

来源:http://www.reddit.com/r/java/comments/16ovek/understanding_when_to_use_jpa_vs_hibernate/