2009-11-20 55 views

回答

15

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

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标准。

9

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

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

+1

事实上,休眠有'Session',但是这是不是真的一个概念,它只是*工作单元*的一个实现,它是一个共享的ORM概念(Toplink具有'UnitOfWork',JDO具有'PersistenceManager',Hibernate具有'Session'')。 – 2009-11-23 23:17:28

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规范,休眠让你声明的@IdClass
  5. 标识符生成

    关联的属性香草
    • 包级别定义不支持JPA spe cification。但是,您可以在包级别
  6. 批注

    • Hibernate注解支持一些未明确JPA规范支持使用@GenericGenerator。您可以使用@MappedSuperclass批注对嵌入对象进行批注,以使超类属性保持持久(请参阅@MappedSuperclass以获取更多信息)。
  7. 鉴别

    • @ org.hibernate.annotations.DiscriminatorOptions允许有选择地指定休眠未在JPA标准化特定的识别选项。可用的选项包括力和插入
  8. 事务

    • Hibernate提供更冲洗模式比在JPA说明书中描述的一个。特别是FlushMode.MANUAL用于长时间运行的对话。请参阅Hibernate核心参考文档以获取更多信息。
  9. 静态元模型

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