JPA和Hibernate有什么区别?

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

我有使用iBatis的经验,现在我正在尝试学习Hibernate或JPA2。 我拿起了Pro JPA2书,它一直提到“JPA provider”。 例如:

如果您认为某项功能应该标准化,您应该向JPA提供商说出要求并提出要求

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

  • 通过单独使用JPA2,我可以通过简单地注释我的POJO来从数据库中获取数据
  • JPA2是否应该与“JPA Provider”(例如TopLink或Hibernate)一起使用? 如果是这样,那么与单独使用JPA2相比,使用JPA2 + Hibernate有什么好处,或者与单独使用Hibernate相比?
  • 你能推荐一本好实用的JPA2书籍吗? “Pro JPA2”似乎更像是一本关于JPA2的圣经和参考资料(直到本书后半部分才进入查询)。 有没有一本书对JPA2采取问题/解决方案?

  • 正如你所说的JPA只是一个规范,这意味着没有实现。 您可以使用JPA批注尽可能多地注释类,但是如果没有实现,则不会发生任何事情。 将JPA视为必须遵循的准则或接口,而Hibernate的JPA实现是符合JPA规范定义的API的代码,并提供了引擎盖下的功能。

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

    有关更详细的说明,请阅读我的博客条目。


    JPA是舞蹈,Hibernate是舞蹈演员。


    没有对JCP的语言和理解的历史观点,有些事情是太难理解了。

    通常有第三方开发可执行功能或填补不属于官方JDK组成部分的软件包。 由于各种原因,该功能可能通过JCP(Java Community Process)成为Java JDK的一部分,

    Hibernate(2003年)提供了一种抽象SQL的方法,并允许开发人员从持久对象(ORM)角度考虑更多。 你通知hibernate关于你的实体对象,它会自动生成持久化策略。 Hibernate提供了一个实现来实现这个功能,API提供了通过XML配置或注释驱动实现。

    现在的基本问题是,你的代码与特定的供应商(Hibernate)紧密结合,因为许多人认为应该更通用。 因此需要一个通用的持久性API。

    与此同时,来自Hibernate和其他ORM工具供应商的大量输入的JCP正在开发JSR 220(Java规范请求),这导致了JPA 1.0(2006)以及最终JSR 317(它是JPA 2.0(2009))。 这些是通用Java持久性API的规范。 API在JDK中作为一组接口提供,以便您的类可以依赖javax.persistence,而不必担心正在执行持久化对象工作的特定供应商。 这只是API而不是实现。 Hibernate现在成为实现JPA 2.0规范的许多供应商之一。 您可以向JPA编码并选择符合您需求的任何符合要求的ORM供应商。

    有些情况下Hibernate可能会给你没有编入JPA的功能。 在这种情况下,您可以选择直接在您的类中插入Hibernate特定注释,因为JPA不提供执行此操作的界面。

    资料来源:http://www.reddit.com/r/java/comments/16ovek/understanding_when_to_use_jpa_vs_hibernate/

    链接地址: http://www.djcxy.com/p/37007.html

    上一篇: What's the difference between JPA and Hibernate?

    下一篇: Is it possible to have immutable fields in Hibernate/JPA?