我知道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的问题/解决方法的书?
来自维基。
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只是一个需要具体实现的规范。
现在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实现的扩展。
如果没有语言的历史视角和对JCP的理解,有些事情就很难理解。
通常会有第三方开发包来执行官方JDK不包含的功能或填补空白。由于各种原因,该函数可能通过JCP (Java社区进程)成为Java JDK的一部分。
Hibernate(2003年)提供了一种抽象SQL的方法,并允许开发人员更多地从持久化对象(ORM)的角度进行思考。你通知hibernate关于你的Entity对象,它会自动生成持久化它们的策略。Hibernate提供了实现和API,通过XML配置或注释来驱动实现。
现在的基本问题是,您的代码与特定的供应商(Hibernate)紧密耦合,而许多人认为这应该是更通用的。因此需要通用的持久性API。
Meanwhile, the JCP with a lot of input from Hibernate and other ORM tool vendors was developing JSR 220 (Java Specification Request) which resulted in JPA 1.0 (2006) and eventually JSR 317 which is JPA 2.0 (2009). These are specifications of a generic Java Persistence API. The API is provided in the JDK as a set of interfaces so that your classes can depend on the javax.persistence and not worry about the particular vendor that is doing the work of persisting your objects. This is only the API and not the implementation. Hibernate now becomes one of the many vendors that implement the JPA 2.0 specification. You can code toward JPA and pick whatever compliant ORM vendor suits your needs.
在某些情况下,Hibernate可能会提供JPA中没有编码的特性。在这种情况下,您可以选择直接在类中插入Hibernate特定的注释,因为JPA没有提供接口来做这件事。
来源:http://www.reddit.com/r/java/comments/16ovek/understanding_when_to_use_jpa_vs_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:就像一个接口,没有具体的实现来使用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,你所有的困惑都将得到解答。
我尽量用简单的话解释。
假设你需要一辆车,我们都知道他们有几个a级制造商,如梅赛德斯,宝马,奥迪等。
现在在上面的声明中,CAR(是一种规格),因为每辆车都有共同的特征,比如有四个轮子的东西,可以在道路上行驶。所以它像JPA。
奔驰、宝马、奥迪等只是使用常见的汽车功能,并根据他们的客户基础添加功能,所以他们正在实现汽车规范,如hibernate、iBATIS等。
因此,通过这个通用特性,jpa和hibernate只是一个实现,根据他们的jboss的需要。
还有一件事
JPA包括一些基本属性,所以在未来,如果你想改变hibernate到任何其他实现,你可以很容易地切换,而不需要太多的头痛,这些基本属性包括JPA注释,可以工作于任何实现技术,JPQL查询。
因此,我们主要使用JPA类型技术实现hibernate,只是为了以防万一我们想根据客户需要切换我们的实现,加上您将编写更少的代码,因为JPA中涉及一些常见的特性。
如果有人仍然不清楚,那么你可以评论,因为我是新的堆栈溢出。
谢谢你!
JPA是您在数据层实现的规范,用于执行db操作、OR映射和其他必需的任务。
由于它只是一个规范,您需要一个工具来实现它。该工具可以是Hibernate、TopLink、iBatis、spring-data等。
如果您在数据层中使用Hibernate,则不一定需要JPA。但是,如果您为Hibernate使用JPA规范,那么它将使将来切换到其他ORM工具(如iBatis、TopLink)变得容易,因为该规范对其他工具也是通用的。
*(如果你还记得,你导入javax.persistence.*;当你使用注释或映射(如@Id, @列,@GeneratedValue等)在Hibernate,这是你在Hibernate下使用JPA,你可以使用JPA的@查询和其他功能)