我知道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/

其他回答

JPA只是一个需要具体实现的规范。 现在oracle提供的默认实现是“Eclipselink”。(Toplink由Oracle捐赠给Eclipse基金会,与eclipselink合并)

(参考:http://www.oracle.com/technetwork/middleware/toplink/index-085257.html http://www.eclipse.org/org/press-release/20080317_Eclipselink.php )

使用Eclipselink,可以确保代码在需要时可以移植到任何实现。 Hibernate也是一个完整的JPA实现+ MORE (JPA Plus的一种)。Hibernate是JPA的超级集,具有一些额外的Hibernate特定功能。 因此,在Hibernate中开发的应用程序在切换到其他实现时可能不兼容。 hibernate仍然是大多数开发人员作为JPA实现的选择,并被广泛使用。

另一个JPA实现是OpenJPA (openjpa.apache.org),它是Kodo实现的扩展。

JPA只是一个规范,而Hibernate是JPA提供者之一,即Hibernate实现了JPA合同中提到的各种事情。

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:就像一个接口,没有具体的实现来使用JPA中的功能。

Hibernate:只是一个JPA提供者,它在JPA中实现了一些功能,并且可以有一些JPA中没有的额外功能。

提示:你可以使用

     *combo 1* : JPA + JPA Provider(Hibernate) 
     *combo 2* : only Hiberante which does not need any interface 

Combo 1:当您觉得您的hibernate没有提供更好的性能,并且希望在不必再次编写JPA时更改JPA Provider时使用。您可以编写另一个JPA Provider…并且可以随心所欲地改变。

Combo 2:很少使用,因为您不打算不惜任何代价更改JPA Provider。

访问http://blog-tothought.rhcloud.com//post/2,你所有的困惑都将得到解答。

JPA是舞蹈,Hibernate是舞者。