Hibernate 和 Hibernate JPA 的区别

Posted

技术标签:

【中文标题】Hibernate 和 Hibernate JPA 的区别【英文标题】:Difference between Hibernate and Hibernate JPA 【发布时间】:2013-02-06 18:57:41 【问题描述】:

我发现了很多类似的问题

Difference between Hibernate library and Hibernate JPA library What's the difference between JPA and Hibernate? similarity and difference between jpa and hibernate

但是没有人回答我的下一个问题。使用 org.hibernate.SessionFactory 和 JPA javax.persistence.EntityManager 实现的经典休眠方法有什么区别?我听说这个 JPA 实现使用 org.hibernate.SessionFactory 并且像包装器一样工作,是真的吗?

【问题讨论】:

【参考方案1】:

确实。

JPA 只是一个 API,它允许您从使用的持久层中抽象出来。 Hibernate 提供了EntityManager 接口的实现,它充当adapter - 它使用与休眠SessionManager 相同的底层方法。

这个想法是,例如,您可以将实现切换到 Eclipse Link,而不必更改任何源代码。

【讨论】:

【参考方案2】:

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

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

【讨论】:

你已经解释得很好了。谢谢!【参考方案3】:

这是你问题的答案

使用经典的hibernate方法有什么区别 org.hibernate.SessionFactory 和 JPA javax.persistence.EntityManager 实施?

org.hibernate.SessionFactory 

如果您将 undeline ORM 更改为 IBatis(例如),您也需要更改代码。

javax.persistence.EntityManager 

如果你将 undeline ORM 更改为 IBatis(例如)你不需要更改代码。

【讨论】:

我已经回答了你的第一个问题。【参考方案4】:

关于你的第一个问题,

JPA 是一个 Java API 规范,它描述了使用 Java 平台对应用程序中的关系数据进行管理。其中 Hibernate 是一个遵循 JPA 规范的 ORM(对象关系映射)库。

您可以将 JPA 视为一组由 Hibernate 实现的规则。

回答你的第二个问题,

由于 JPA 只是一个抽象的持久层,它需要实现。而 Hibernate 实现了使用 hibernate SessionManager 的 EntityManager 接口。

通过这种方式,您完全脱离了实现方式,意味着您可以随时切换到任何 Hibernate 或 OenJPA 或任何其他方式,无需额外的代码更改。

【讨论】:

以上是关于Hibernate 和 Hibernate JPA 的区别的主要内容,如果未能解决你的问题,请参考以下文章

JPA和Hibernate的关系

Hibernate 和 Hibernate JPA 的区别

JPASpringData JPA Hibernate和Mybatis 的区别和联系

@Transactional 与 JPA 和 Hibernate 有啥用?

Spring Hibernate JPA 联表查询

Hibernate注解开发(未完待续)