【问题标题】:Difference between Hibernate and Hibernate JPAHibernate 和 Hibernate JPA 的区别
【发布时间】:2013-02-06 18:57:41
【问题描述】:
我发现了很多类似的问题
但是没有人回答我的下一个问题。使用 org.hibernate.SessionFactory 和 JPA javax.persistence.EntityManager 实现的经典休眠方法有什么区别?我听说这个 JPA 实现使用 org.hibernate.SessionFactory 并且像包装器一样工作,是真的吗?
【问题讨论】:
标签:
java
hibernate
jpa
orm
【解决方案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 或任何其他方式,无需额外的代码更改。