我知道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是接口,Hibernate是该接口的一个实现。

其他回答

来自维基。

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是实现。

传统上有多种Java ORM解决方案:

冬眠 拓联 建分办

每个实现定义自己的映射定义或客户端API。JPA专家组收集了所有这些工具中的精华,因此他们创建了Java Persistence API标准。

从客户端角度来看,标准的持久性API非常方便,可以相对容易地将一个实现转换为另一个实现(尽管实际上并没有那么简单,因为在大型项目中,无论如何都必须使用特定的非标准特性)。

标准JPA将Java ORM的竞争推向了一个新的水平,这只会导致更好的实现。

正如我在《高性能Java持久性》一书中所解释的那样,Hibernate提供了JPA还不支持的特性:

extended identifier generators (hi/lo, pooled, pooled-lo) transparent prepared statement batching customizable CRUD (@SQLInsert, @SQLUpdate, @SQLDelete) statements static or dynamic collection filters (e.g. @FilterDef, @Filter, @Where) and entity filters (e.g. @Where) mapping properties to SQL fragments (e.g. @Formula) immutable entities (e.g. @Immutable) more flush modes (e.g. FlushMode.MANUAL, FlushMode.ALWAYS) querying the second-level cache by the natural key of a given entity entity-level cache concurrency strategies (e.g. Cache(usage = CacheConcurrencyStrategy.READ_WRITE)) versioned bulk updates through HQL exclude fields from optimistic locking check (e.g. @OptimisticLock(excluded = true)) versionless optimistic locking (e.g. OptimisticLockType.ALL, OptimisticLockType.DIRTY) support for skipping (without waiting) pessimistic lock requests support for Java 8 Date and Time support for multitenancy support for soft delete (e.g. @Where, @Filter)

这些额外的特性使Hibernate能够满足大型企业应用程序所需的许多持久性需求。

JPA是舞蹈,Hibernate是舞者。

JPA is Java Persistence API. Which Specifies only the specifications for APIs. Means that the set of rules and guidelines for creating the APIs. If says another context, It is set of standards which provides the wrapper for creating those APIs , can be use for accessing entity object from database. JPA is provided by oracle.When we are going to do database access , we definitely needs its implementation. Means JPA specifies only guidelines for implementing APIs. Hibernate is a JPA provider/Vendor who responsible for implementing that APIs. Like Hibernate TopLink and Open JPA is some of examples of JPA API providers. So we uses JPA specified standard APIs through hibernate.

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

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

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