我知道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是一个标准化orm - api的规范。Hibernate是JPA实现的供应商。因此,如果您将JPA与hibernate一起使用,您可以使用标准的JPA API, hibernate将在引子之下,提供更多的非标准函数。 参见http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html_single/和http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/

其他回答

来自维基。

Motivation for creating the Java Persistence API Many enterprise Java developers use lightweight persistent objects provided by open-source frameworks or Data Access Objects instead of entity beans: entity beans and enterprise beans had a reputation of being too heavyweight and complicated, and one could only use them in Java EE application servers. Many of the features of the third-party persistence frameworks were incorporated into the Java Persistence API, and as of 2006 projects like Hibernate (version 3.2) and Open-Source Version TopLink Essentials have become implementations of the Java Persistence API.

正如JCP页面所述,Eclipse链接是JPA的参考实现。再看看这个答案。

JPA本身具有弥补标准ORM框架的功能。由于JPA是Java EE规范的一部分,您可以在项目中单独使用JPA,并且它应该与任何Java EE兼容的服务器一起工作。是的,这些服务器将拥有JPA规范的实现。

Hibernate是最流行的ORM框架,一旦JPA引入,Hibernate就符合JPA规范。除了它应该遵循的基本规范集之外,hibernate还提供了大量额外的东西。

JPA是舞蹈,Hibernate是舞者。

JPA是您在数据层实现的规范,用于执行db操作、OR映射和其他必需的任务。

由于它只是一个规范,您需要一个工具来实现它。该工具可以是Hibernate、TopLink、iBatis、spring-data等。

如果您在数据层中使用Hibernate,则不一定需要JPA。但是,如果您为Hibernate使用JPA规范,那么它将使将来切换到其他ORM工具(如iBatis、TopLink)变得容易,因为该规范对其他工具也是通用的。

*(如果你还记得,你导入javax.persistence.*;当你使用注释或映射(如@Id, @列,@GeneratedValue等)在Hibernate,这是你在Hibernate下使用JPA,你可以使用JPA的@查询和其他功能)

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

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

形象地说,JPA只是接口,Hibernate/TopLink类(即接口实现)。

必须有接口实现才能使用接口。但是你可以通过接口使用类,即通过JPA API使用Hibernate,或者你可以直接使用实现,即直接使用Hibernate,而不是通过纯JPA API。

关于JPA的好书是Vlad Mihalcea的《高性能Java持久性》。