代码之家  ›  专栏  ›  技术社区  ›  Satya

JPA与Hibernate的相似性与差异

  •  15
  • Satya  · 技术社区  · 15 年前

    JPA和Hibernate的相似性和区别是什么?

    4 回复  |  直到 11 年前
        1
  •  15
  •   Jeff Foster    15 年前

    JPA(Java持久化API)是持久化提供者实现的接口。Hibernate就是JPA的一种实现。

        2
  •  14
  •   Pascal Thivent    15 年前

    这是JSR-000220 Enterprise JavaBeans 3.0最终版本(持久性)的介绍:

    本文档是Java持久化和对象/Rela管理的API规范。 用Java EE和Java SE进行映射。这项工作的技术目标是提供 Java应用程序开发人员使用Java域模型到人的对象/关系映射工具 老化关系数据库。

    此持久性API_以及本文档中定义的查询语言和对象/关系映射元数据需要在Enterprise JavaBeans 3.0下得到支持。它的目标还在于单独使用JavaSE。

    整个Java社区的主要专家已经聚在一起构建这个Java持久性标准。这项工作包括来自Hibernate、TopLink和JDO社区以及EJB社区的贡献。

    换句话说,JPA是 标准化 持久性的API。Hibernate提供标准的实现(即,当使用JPA时,它可以用作底层持久性引擎)。

    在JPA之前,Hibernate是Java中对象持久性的一种事实上的标准。Hibernate被认为是JPA的主要贡献者,因此它们之间有很多相似之处(我甚至可以说,由于ORM概念很常见,所以所有ORM解决方案之间都有很多相似之处)。然而,由于政治或技术上的各种原因,JPA工作组不能在JPA的第一个版本中包含所有内容,因此JPA实际上是Hibernate的一个子集(这是一个简化的视图,但实际情况非常接近)。因此,Hibernate和其他JPA实现提供了自己的专有扩展(这意味着非标准,即不可从一个提供者移植到另一个提供者)到您可能使用或不使用的JPA标准。

        3
  •  9
  •   non sequitor    15 年前

    正如@pascal hibernate在JPA标准之前所指出的那样(它现在是JSR 317 JPA 2.0,Hibernate已经在3.5中实现了,现在已经开始使用了)。因此,JPA还有其他供应商,例如Oracle Toplink、Apache OpenJPA。要在休眠中严格使用JPA,必须使用 EntityManager Session 这是一个休眠的概念预约会JPA。同样,对于严格的JPA,您必须使用 EntityManagerFactory 并置于 SessionFactory .

    这个 实体管理器 实体管理器工厂 事实上,是薄包装周围的 会话 实习工厂 分别。此外,core/annotations hibernate提供了JPA规范的扩展,使您的生活更轻松。在JPA2 Hibernate拥有一个标准API之前,它允许您以OO方式以编程方式构造查询。JPA2现在使这个功能成为标准——JPA标准与Hibernate版本有点不同,因为它使用了泛型。所以基本上休眠功能是JPA的超集。

        4
  •  1
  •   Sergiy Seletskyy    12 年前

    以下是受试者之间的一些差异列表(摘自Hibernate文档)

    1. 实体。Hibernate超出了JPA规范并提供了额外的配置。其中一些托管在@org.hibernate.annotations.entity上

      • dynamicinsert/dynamicupdate(默认为false)
      • selectbeforeupdate(默认为false)
      • 多态性
      • 姊妹
      • 乐观锁(版本,全部,脏,无)
    2. ID作为使用组件类型的属性

      • 虽然JPA不支持,但Hibernate允许您将关联直接放置在嵌入的ID组件中(而不必使用@mapsid注释)。
    3. 多个没有标识符类型的ID属性

      • 另一种更自然的方法是将@id放在实体的多个属性上。这种方法只受Hibernate支持(不兼容JPA),但不需要额外的可嵌入组件。
    4. 具有专用标识符类型的多个ID属性

      • 虽然不是JPA标准,但是hibernate让我们在@idclass中声明普通关联属性
    5. 标识符生成器

      • JPA规范不支持包级别定义。但是,您可以在包级别使用@genericgenerator
    6. 注解

      • Hibernate注释支持JPA规范没有明确支持的内容。可以使用@mappedsuperclass注释对嵌入对象进行注释,以使超类属性保持不变(有关详细信息,请参见@mappedsuperclass)。
    7. 鉴别器

      • @org.hibernate.annotations.discriminator options允许选择指定JPA中未标准化的Hibernate特定的鉴别器选项。可用选项包括强制和插入
    8. 交易

      • Hibernate提供的刷新模式比JPA规范中描述的要多。用于长时间运行对话的特殊FlushMode.Manual。有关更多信息,请参阅Hibernate核心参考文档。
    9. 静态元模型

      • 重要的。 到目前为止,JPA2元模型不提供任何访问与物理模型相关的关系信息的工具。预计这将在未来的规范版本中解决。