Hibernate 和 JPA 有啥区别?
Posted
技术标签:
【中文标题】Hibernate 和 JPA 有啥区别?【英文标题】:What are the differences between Hibernate and JPA?Hibernate 和 JPA 有什么区别? 【发布时间】:2011-08-06 10:31:51 【问题描述】:当我在大学学习网络编程时,他们向我们介绍了休眠。
我们使用了一段时间,我什至有机会在公司的真实场景中使用它将近 8 个月。 现在我完全切换到 Java EE 6(我恋爱了 :)),我使用 JPA 来满足我的 ORM 需求。
我使用它已经有几个月了,但我真的不明白一个和另一个之间有什么区别。为什么有些人说一个或另一个更好或更坏? 我在两者中进行映射和注释的方式几乎相同......
也许你能解决我的一些疑惑:
-各有什么优缺点?
-Hibernate 是使用 JPA 还是其他方式(它们是否相互依赖)?
-从特征的角度来看,一个有哪些特征没有另一个?
-两者之间还有其他区别吗?
【问题讨论】:
What's the difference between JPA and Hibernate?的可能重复 【参考方案1】:JPA(Java Persistence API)是一个 API,JPA 2.0 属于 JSR 317 组。基本上它是一个通过使用 ORM(对象关系映射)进行数据持久性来管理关系数据的框架。
Hibernate 是一个 ORM 库,可将您的 POJO/JavaBeans 映射到您的数据持久性。 ORM 和 JPA 都有用于将 POJO 映射到 DB 表的对象/关系元数据(XML、注释)。
Hibernate 是使用 JPA 还是其他 周围的方式(他们是否取决于每个 其他)?
Hibernate 3 现在支持 JPA 2.0。 JPA 是使用对象模型描述关系数据的关系和管理的规范。由于 JPA 是一个 API,Hibernate 实现了这个 API。您所要做的就是使用 JPA API 类/接口编写程序,将 Hibernate 配置为 JPA 资源,瞧,您就可以运行 JPA。
有什么优点和 各有优缺点?
优点:
避免使用低级 JDBC 和 SQL 代码。 它是免费的(EclipseLink 例如用于 JPA)。 JPA 是标准,是 EJB3 和 Java EE 的一部分。这就是我对 Hibernate 的了解。
【讨论】:
如果 Java EE 5 只支持 JPA 1.0,我可以在 Java EE 5 环境中使用最新版本的 HIbernate (4.1.x) 吗? 这个答案并不清楚,如果没有一个甚至可以是 Hibernate 的实现,JPA 就无法工作。【参考方案2】:Hibernate 是新现代 JPA 的灵感来源。 EJB 3.0 ORM (JPA) 基于简单、干净、美观的 Hibernate。
JPA 诞生时,Hibernate 成为了 JBoss 的 JPA 实现基础。所以如果你使用的是 JBoss 和 JPA,你很可能在下面使用 Hibernate。
我看不出其中一个比另一个有任何显着优势。也许主要的是,如果您使用 JPA,那么您使用的是纯 JavaEE 实现。这意味着,理论上,您可以切换到不同的应用程序服务器,即使新的应用程序服务器没有使用 Hibernate,您的应用程序仍然可以工作。请记住,我说的是 IN THEORY。 :-)
JPA 在某些应用服务器中使用 Hibernate。 RedHat 的 JBoss 是使用 Hibernate 实现 JPA 的主要产品。
【讨论】:
关于当你提到“JPA在一些应用服务器中使用Hibernate”的时候我很好奇,GlassfishV3.0是否使用了Hibernate?我使用 Glassfish,我想有时我在控制台上看到一些与休眠相关的消息,在构建或做一些映射时。 @sfrj 我不认为 Glassfish 使用 Hibernate。我认为它使用了一个名为 TopLink(属于 Oracle)的库。 我可能弄错了,我以为我在控制台中看到过几次休眠这个词 :) 让我们明确一点;任何应用服务器都可以任何 JPA 实现。它可能与 JEE 供应商开发的捆绑在一起,但这并不一定意味着最适合该应用程序,您可以使用您选择的实现。【参考方案3】:JPA 是一种用于持久性映射的 API 标准。它是在 Hibernate 之后很久才开发的,并深受其影响。
要使用 JPA,您需要一个 JPA 实现。 Hibernate 就是这样一种 JPA 实现,因为它被扩展以实现它所启发的 API。
此外,Hibernate 提供了一些 JPA 标准没有提供的功能,但这些功能通常是不需要的。
另一方面,如果您只使用 JPA 功能,您的代码也应该使用不同的 JPA 实现——经验表明兼容性很少是 100%,但切换到不同的实现不需要很多工作。
【讨论】:
【参考方案4】:JPA 是一个标准,由许多不同的库实现,例如 TopLink。 Hibernate 是一个早于 JPA 就存在的库,并且具有 JPA 所没有的一些特性。
Criteria api 两者都有,但我认为 Hibernate 的使用要简单得多。 因此,如果您使用 JPA,则可以毫无问题地切换到不同的实现,或者您可能有一个定义基本 JPA dao 的基础项目和两个使用不同实现的不同项目。
如果您使用 Hibernate,可能更容易找到示例和专家。
【讨论】:
【参考方案5】:interface JPA
void merge(Object o);
class Hibernate implements JPA
@Override
public void merge(Object o)
// Implementation here
【讨论】:
虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。【参考方案6】:我会尽量解释清楚。
-各有什么优缺点?
JPA 属性是可移植的。以 javax.persistence 开头的库与 JPA 相关联。像 hibernate 这样的提供者提供了不可移植的属性。因此,最佳实践是尽可能使用 javax.persistence。
-Hibernate 是使用 JPA 还是其他方式(它们是否相互依赖)?
JPA 是对 JDBC 的抽象。 JPA 是一个规范。它需要提供者。 Hibernate 是众多提供者之一。
-从特征的角度来看,一个有哪些特征没有另一个?
Hibernate = ORM + JPA 的实现 因此,您会在 Hibernate 中发现一些额外的功能。
-两者之间还有其他区别吗?
Hibernate 在过去几年中发生了很大变化。我发现 JPA 是一致的。因此,如果不需要,请尽可能尝试使用 javax.persistence 库。
【讨论】:
以上是关于Hibernate 和 JPA 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
使用JPA和Hibernate时JOIN和JOIN FETCH有啥区别
@Transactional 与 JPA 和 Hibernate 有啥用?
hibernate的merge和saveOrUpdate方法有啥区别