jpa和hibernate之间的相似性和区别

时间:2009-11-20 12:39:51

标签: java hibernate orm jpa

jpa和hibernate之间的相似性和区别是什么。

4 个答案:

答案 0 :(得分:15)

JPA(Java Persistence API)是持久性提供程序要实现的接口。 Hibernate就是JPA的一个这样的实现。

答案 1 :(得分:14)

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

  

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

     

此持久性API - 与本文档中定义的查询语言和对象/关系映射元数据一起 - 需要在Enterprise JavaBeans 3.0下受支持。它还旨在与Java SE单独使用。

     

整个Java社区的领先专家共同构建了这个Java持久性标准。这项工作包含来自Hibernate,TopLink和JDO社区以及EJB社区的贡献。

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

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

答案 2 :(得分:9)

正如@Pascal所指出的,Hibernate存在于JPA标准之前(它现在是JSR 317 JPA 2.0,Hibernate已经在3.5中实现了早期使用)。所以还有其他JPA提供商,例如Oracle TopLink,Apache OpenJPA。要在Hibernate中严格使用JPA,你必须使用EntityManager作为Session,这是一个早期约会JPA的Hibernate概念。同样,对于严格的JPA,您必须使用EntityManagerFactory作为SessionFactory

EntityManagerEntityManagerFactory实际上分别是SessionSessionFactory的薄包装。此外,核心/注释Hibernate提供了JPA规范的扩展,使您的生活更轻松。在JPA 2之前,Hibernate有一个Criteria API,它允许您以OO方式以编程方式构造查询。 JPA 2现在使这个功能成为标准 - JPA标准与Hibernate版本略有不同,因为它使用了泛型。所以基本上Hibernate功能是JPA的超集。

答案 3 :(得分:1)

以下列出了主题之间的一些区别(摘自Hibernate文档)

  1. 实体。 Hibernate超越了JPA规范并提供了其他配置。其中一些托管在@ org.hibernate.annotations.Entity

    • dynamicInsert / dynamicUpdate(默认为false)
    • selectBeforeUpdate(默认为false)
    • 多态性
    • 持留
    • optimisticLock(版本,全部,脏,无)
  2. id作为使用组件类型的属性

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

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

    的多个id属性
    • 虽然不是JPA标准,但Hibernate允许你在@IdClass中声明vanilla关联属性
  5. 标识符生成器

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

    • Hibernate Annotations支持JPA规范未明确支持的内容。您可以使用@MappedSuperclass批注对嵌入对象进行批注,以使超类属性持久化(有关更多信息,请参阅@MappedSuperclass)。
  7. 鉴别

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

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

    • 重要。 截至今天,JPA 2元模型不提供用于访问与物理模型有关的关系信息的任何工具。预计这将在未来的规范版本中得到解决。