JPA和Hibernate有什么区别?
我知道JPA 2是一个规范,Hibernate是一个ORM的工具。 另外,我明白Hibernate比JPA 2有更多的function。但是从实际的angular度来看,真正的区别是什么?
我有使用iBatis的经验,现在我试图学习Hibernate或JPA2。 我拿起了专业JPA2书,它一直提到“JPA提供者”。 例如:
如果您认为某项function应该标准化,那么您应该向JPA提供商说出要求
这使我困惑,所以我有几个问题:
- 单独使用JPA2可以通过简单地注释我的POJO来从DB获取数据
- JPA2是否应该与“JPA Provider”(例如TopLink或Hibernate)一起使用? 如果是这样的话,与单独使用Hibernate相比,使用JPA2 + Hibernate有什么好处?
- 你能推荐一本好实用的JPA2书吗? “Pro JPA2”看起来更像是一本关于JPA2的圣经和参考书(直到后半部分才进入查询)。 是否有一本书对JPA2采取问题/解决scheme?
正如你所说的JPA只是一个规范,意思是没有实现。 您可以使用JPA批注尽可能多地注释您的类,但是如果没有实现,则不会发生任何事情。 将JPA视为必须遵循的准则或接口,而Hibernate的JPA实现是符合JPA规范定义的API的代码,并提供了引擎盖下的function。
在JPA中使用Hibernate时,实际上是使用Hibernate JPA实现。 这样做的好处是可以将Hibernate的JPA实现换成另一个JPA规范的实现。 当你使用直接的Hibernate时,你正在locking实现,因为其他的ORM可能使用不同的方法/configuration和注解,所以你不能切换到另一个ORM。
JPA是舞蹈,Hibernate是舞蹈家。
没有JCP的语言和理解的历史视angular,有些事情是太难理解了。
通常会有第三方开发执行function或填补不属于官方JDK的差距的软件包。 由于各种原因,这个函数可能通过JCP(Java Community Process)成为Java JDK的一部分,
Hibernate(2003年)提供了一种抽象SQL的方法,允许开发人员从持久化对象(ORM)的angular度考虑更多。 你通知hibernate关于你的实体对象,并自动生成策略来坚持它们。 Hibernate提供了一个实现来实现这个function,API提供了通过XMLconfiguration或者注释驱动实现。
现在的根本问题是,你的代码与特定的供应商(Hibernate)紧密结合,因为许多人认为应该更通用。 因此需要一个通用的持久性API。
与此同时,来自Hibernate和其他ORM工具供应商的大量input的JCP正在开发导致JPA 1.0(2006)的JSR 220(Java规范请求),最终开发了JPA 2.0(2009)的JSR 317。 这些是通用Java持久性API的规范。 在JDK中提供的API是一组接口,以便您的类可以依赖于javax.persistence,而不必担心正在执行持久化对象的特定供应商。 这只是API而不是实现。 Hibernate现在成为实现JPA 2.0规范的许多供应商之一。 您可以向JPA进行编码,然后select适合您的ORM供应商。
有些情况下,Hibernate可能会给你没有编入JPA的function。 在这种情况下,您可以select直接在您的类中插入Hibernate特定注释,因为JPA不提供用于执行此操作的接口。
来源: http : //www.reddit.com/r/java/comments/16ovek/understanding_when_to_use_jpa_vs_hibernate/
JPA是接口,而Hibernate是实现。
传统上有多种Java ORM解决scheme:
- 过冬
- TopLink的
- JDO
每个实现定义自己的映射定义或客户端API。 JPA专家组收集了所有这些工具中最好的,所以他们创build了Java持久性API标准。
从客户的angular度来看,一个标准的持久性API非常方便,使得将一个实现与另一个实现切换相对比较容易(尽pipe在实践中并不那么简单,因为在大型项目中,您将不得不使用特定的非标准特性) 。
标准的JPA将Java ORM竞争推向了一个新的高度,这只能导致更好的实现。
正如我的书“高性能Java持久性”所述 , Hibernate提供了JPA尚不支持的function :
- 扩展标识符生成器( hi / lo , pooled,pooled-lo )
- 透明准备语句批处理
- 可定制的CRUD(
@SQLInsert
,@SQLUpdate
,@SQLDelete
)语句 - 静态或dynamic收集filter(例如
@FilterDef
,@Where
,@Where
)和实体filter(例如@Where
) - 将属性映射到SQL片段(例如
@Formula
) - 不可变的实体(例如
@Immutable
) - 更多的冲洗模式(例如
FlushMode.MANUAL
,FlushMode.ALWAYS
) - 通过给定实体的自然键来查询二级caching
- 实体级caching并发策略(例如
Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
) - 通过HQL版本化批量更新
- 从乐观locking检查排除字段(例如
@OptimisticLock(excluded = true)
) - 无版本乐观locking (例如,
OptimisticLockType.ALL
,OptimisticLockType.DIRTY
) - 支持跳过(无需等待)悲观的locking请求
- 支持Java 8date和时间
- 支持多租户
- 支持软删除 (例如
@Where
,@Where
)
这些额外的function使Hibernate能够解决大型企业应用程序所要求的许多持久性需求。
从Wiki 。
创buildJava持久性API的动机
许多企业Java开发人员使用由开放源代码框架或数据访问对象(而不是实体bean)提供的轻量级持久对象:实体bean和企业bean的声誉过于重量和复杂,只能在Java EE应用程序服务器中使用它们。 第三方持久性框架的许多特性都被整合到了Java持久性API中,到2006年,像Hibernate(3.2版本)和开放源代码TopLink Essentials这样的项目已经成为Java持久性API的实现。
正如JCP页面所述,Eclipse链接是JPA的参考实现。 更多关于这个问题请看这个答案 。
JPA本身具有将构成标准ORM框架的function。 由于JPA是Java EE规范的一部分,因此可以在项目中单独使用JPA,并且应该可以与任何Java EE兼容的服务器一起使用 。 是的,这些服务器将具有JPA规范的实现。
Hibernate是最受欢迎的ORM框架,一旦JPA引入了hibernate,就符合JPA规范。 除了应遵循的基本规范之外,hibernate还提供了大量额外的东西。
Hibernate是一个JPA提供者。
JPA与 Krishna Srinivasan的Hibernate页面说:
JPA是访问,持久和pipe理Java对象和关系数据库之间的数据的规范。 由于定义说它的API,它只是规范。 API没有实现。 JPA为开发符合标准的接口规定了一系列规则和指南。 直接点:JPA只是实现对象关系映射(ORM)的指导原则,没有实现的底层代码。 在哪里,Hibernate是JPA准则的实际实现。 当hibernate实现JPA规范时,将遵循规范中提到的所有标准,由JPA组进行authentication。 例如,JPA准则将提供强制和可选function的信息,作为JPA实现的一部分来执行。
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的sorting)。 Hibernate是具有一些额外的Hibernate特定function的JPA超集。 所以在Hibernate中开发的应用程序在切换到其他实现时可能不兼容。 仍然hibernate是大多数开发人员作为JPA实施和广泛使用的select。
另一个JPA实现是OpenJPA(openjpa.apache.org),它是Kodo实现的扩展。
JPA:就像一个接口 ,没有具体的实现来使用JPA中的函数。
Hibernate:只是JPA提供者 ,它具有JPA中的函数的实现,并且可以具有JPA中可能不存在的一些额外function。
提示:你可以使用
*combo 1* : JPA + JPA Provider(Hibernate) *combo 2* : only Hiberante which does not need any interface
组合1 :当您觉得您的hibernate没有提供更好的性能,并且想要更改JPA提供程序,那么您不必再次编写您的JPA就可以使用组合1 。 您可以编写另一个JPA提供程序…并可以多次更改。
组合2 :使用非常less,因为您不打算更改您的JPA提供程序。
访问http://blog-tothought.rhcloud.com//post/2 ,在那里你完全的困惑将变得清晰。
JPA是接口,Hibernate是该接口的一个实现。
JPA是标准化ORM-API的规范。 Hibernate是JPA实现的供应商。 所以如果你使用JPA和hibernate,你可以使用标准的JPA API,hibernate将会在后台,提供更多的非标准function。 见http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html_single/和http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/
JPA和Hibernate的区别
JPA是访问,持久和pipe理Java对象和关系数据库之间的数据的规范。 由于定义说它的API,它只是规范。 API没有实现。 JPA为开发符合标准的接口规定了一系列规则和指南。 直接点:JPA只是实现对象关系映射(ORM)的指导原则,没有实现的底层代码。
在哪里,Hibernate是JPA准则的实际实现。 当hibernate实现JPA规范时,将遵循规范中提到的所有标准由JPA组进行authentication。 例如,JPA准则将提供强制和可选function的信息,作为JPA实现的一部分来执行。
Hibernate是一个JPA提供者。 当规范发生新的变化时,hibernate会为JPA规范发布其更新的实现。
JPA只是一个规范。市场上有很多实现JPA的厂商。 不同types的供应商以不同的方式实施JPA。 所以不同types的供应商提供不同的function,所以根据您的要求select合适的供应商
如果您使用Hibernate或其他供应商而不是JPA,则无法轻松迁移到EclipseLink或将OpenJPA迁移到Hibernate.But如果使用JPA,则只需更改持久性XML文件中的提供即可。因此迁移很容易JPA。
这是关于这个问题的最好的文章之一。 在这篇长7页的文章中,我们将介绍iBatis / Hibernate / JPA之间的优缺点。
对文章贡献者的荣誉
对于JPA规范部分从第5页开始阅读..否则从这里开始从头开始:
JPA是一个API,Hibernate实现的一个API .Hibernate早于JPA。 在JPA之前,你编写本地hibernate代码来完成你的ORM。 JPA只是接口,所以现在你写JPA代码,你需要find一个实现。 Hibernate恰好是一个实现。
所以你的select是这样的:冬眠,toplink等…
JPA的优势在于它允许您在需要时replace您的实现。 缺点是本地hibernate / toplink / etc … API可能提供JPA规范不支持的function。
虽然JPA是规范,但Hibernate是遵循规范中规定的规则的实现提供者。
Java–它的独立性不仅来自操作系统,还来自厂商。
因此,您应该能够在不同的应用程序服务器上部署您的应用程序。 JPA在任何兼容Java EE的应用程序服务器中实现,它允许交换应用程序服务器,但是实现也在改变。 Hibernate应用程序可能更容易在不同的应用程序服务器上部署。
JPA是一个Java API规范,它描述了在使用Java平台的应用程序中pipe理关系数据。 其中Hibernate是遵循JPA规范的ORM(对象关系映射)库。
您可以将JPA视为由Hibernate实现的一组规则。
JPA是JSR,即实现对象关系映射的Java规范要求,没有具体的实现代码。 它定义了用于访问,维护和pipe理Java对象和关系数据库之间的数据的一些规则。在它的介绍中,EJB被replace为它被Java开发者社区批评为重量级。 Hibernate是JPA可以使用的指导原则之一.Hibernate是一个高性能的对象/关系持久性和查询服务,它是在开源GNU通用公共许可证(LGPL)下许可的。这样做的好处是你可以将Hibernate的JPA实现换成另一个JPA规范的实现。 当你使用直接的Hibernate时,你正在locking实现,因为其他的ORM可能使用不同的方法/configuration和注解,所以你不能切换到另一个ORM。
JPA只是一个需要具体实现的规范。 oracle提供的默认实现现在是“Eclipselink”。 Toplink是由Oracle捐赠给Eclipse基金会的,与eclipselink合并。
使用Eclipselink,可以肯定的是,如果需要的话,代码可以移植到任何实现中。 Hibernate也是一个完整的JPA实现+ MORE。 Hibernate是具有一些额外的Hibernate特定function的JPA超集。 所以在Hibernate中开发的应用程序在切换到其他实现时可能不兼容。 仍然hibernate是大多数开发人员作为JPA实施和广泛使用的select。
另一个JPA实现是OpenJPA,它是Kodo实现的扩展。
JPA与hibernate
JPA是Java持久性API。 其中仅指定了API的规范。 意味着创buildAPI的一系列规则和准则。 如果说另一个上下文,它提供了创build这些API的包装器的标准,可以用来从数据库访问实体对象。 JPA是由oracle提供的。当我们要做数据库访问时,我们肯定需要它的实现。 手段JPA仅指定实施API的指导原则。 Hibernate是负责实现这些API的JPA提供者/供应商。 像Hibernate TopLink和Open JPA是JPA API提供者的一些例子。 所以我们通过hibernate来使用JPA指定的标准API。
JPA只是一个规范,而Hibernate是JPA提供者之一,即hibernate正在实现JPA合同中提到的各种东西。
JPA或Java Persistence API是ORM实现的标准规范,而Hibernate是实际的ORM实现或框架。