猿问
下载APP

JPA和Hibernate有什么区别?

JPA和Hibernate有什么区别?

我知道JPA 2是一种规范,Hibernate是ORM的工具。另外,我知道Hibernate比JPA 2有更多的特性。但是从实际的角度来看,真正的区别是什么呢?

我有使用iBaties的经验,现在我正在尝试学习Hibernate或JPA 2。我捡到了Pro JPA 2的书,它一直提到“JPA提供者”。例如:

如果您认为某项功能应该标准化,您应该大声说出来,并向您的jpa提供程序提出要求。

这让我很困惑,所以我有几个问题:

  • 仅使用JPA 2,我可以通过简单地注释我的POJO来从DB获取数据吗?
  • JPA 2应该与“JPA提供程序”(例如Toplink或Hibernate)一起使用吗?如果是这样的话,那么与单独使用JPA 2相比,使用JPA 2+Hibernate或单独使用Hibernate有什么好处呢?
  • 你能推荐一本实用的JPA 2书吗?“Pro JPA 2”看起来更像是圣经和JPA 2的参考(直到本书的后半部分才进入查询)。是否有一本关于JPA 2的问题/解决方案方法的书?


慕婉清6462132
浏览 388回答 3
3回答

拉莫斯之舞

正如您所述,JPA只是一个规范,意味着没有实现。您可以使用JPA注释来注释您的类,但是如果没有实现,什么也不会发生。将JPA视为必须遵循的指南或接口,而Hibernate的JPA实现是符合JPA规范定义的API并提供底层功能的代码。当您在JPA中使用Hibernate时,实际上是在使用Hibernate JPA实现。这样做的好处是可以将Hibernate的JPA实现转换为JPA规范的另一个实现。当您使用直接Hibernate时,您将锁定到实现中,因为其他ORM可能使用不同的方法/配置和注释,因此您不能仅仅切换到另一个ORM。有关更详细的描述,请阅读博客条目.

宝慕林4294392

如果没有对语言的历史理解和对JCP的理解,有些事情就太难理解了。通常会有第三方开发执行函数的包,或者填补不是官方JDK一部分的空白。由于各种原因,该函数可能通过JCP(JavaCommunityProcess)成为JavaJDK的一部分。Hibernate(2003年)提供了一种抽象SQL的方法,并允许开发人员更多地考虑持久化对象(ORM)。将实体对象通知Hibernate,它会自动生成持久化策略。Hibernate提供了这样做的实现,API通过XML配置或注释来驱动实现。现在的根本问题是,您的代码会与特定的供应商(Hibernate)紧密耦合,因为很多人认为应该更通用。因此,需要一个通用的持久性API。同时,带有Hibernate和其他ORM工具供应商大量输入的JCP正在开发JSR 220(Java规范请求),这导致了JPA1.0(2006),并最终开发了JSR 317,即JPA2.0(2009)。这些是通用Java持久性API的规范。API是作为一组接口在JDK中提供的,这样您的类就可以依赖于javax.Persistence,而不必担心执行持久化对象工作的特定供应商。这只是API,而不是实现。Hibernate现在成为实现JPA2.0规范的众多供应商之一。您可以为JPA编写代码,并选择符合您需要的任何兼容ORM供应商。在有些情况下,Hibernate可能会为您提供未在JPA中编码的特性。在这种情况下,您可以选择直接在类中插入Hibernate特定的注释,因为JPA没有提供接口来完成这一任务。资料来源:http:/www.redid.com/r/java/Comments/16 ovek/谅解_When_to_use_jpa_vs_Hibernate/

慕粉4167745

JPA是接口,Hibernate是实现。传统上有多种Java ORM解决方案:冬眠托普林京东每个实现定义自己的映射定义或客户端API。JPA专家组收集了所有这些工具中的最好的,因此他们创建了JavaPersistenceAPI标准。从客户端的角度来看,标准持久性api非常方便,这使得相对很容易将一个实现与另一个实现切换(尽管在实践中并不那么简单,因为在大型项目中,无论如何您都必须使用特定的非标准特性)。标准的JPA将JavaORM竞争推向了一个新的水平,这只能带来更好的实现。如在我的书,高性能Java持久性, Hibernate提供了JPA尚未支持的特性。:扩展标识符生成器(嗨/洛, 集合,集合-瞧)透明准备语句批处理可定制的CRUD(@SQLInsert, @SQLUpdate, @SQLDelete)发言静态或动态收集过滤器(例如:@FilterDef, @Filter, @Where)和实体过滤器(例如,@Where)将属性映射到SQL片段(例如,@Formula)不可变实体(例如:@Immutable)更多的同花顺模式(例如:FlushMode.MANUAL, FlushMode.ALWAYS)通过给定实体的自然键查询二级缓存。实体级缓存并发策略(例如:Cache(usage = CacheConcurrencyStrategy.READ_WRITE))通过HQL进行版本大容量更新从乐观锁定检查中排除字段(例如:@OptimisticLock(excluded = true))无版本乐观锁定(如:OptimisticLockType.ALL, OptimisticLockType.DIRTY)支持跳过(无需等待)悲观锁请求支持Java 8日期和时间对多租户的支持支持软删除(如:@Where, @Filter)这些额外的特性使Hibernate能够满足大型企业应用程序所要求的许多持久性需求。
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答