Hibernate和JPA有什么区别?

当我在大学学习网络编程时,他们告诉我们关于hibernate的问题。

我们使用了一段时间,我甚至有机会在一家公司的真实场景中使用它近8个月。 现在我完全切换到Java EE 6( 我爱上了:) ),我使用JPA来满足我的ORM需求。

我使用它已经有几个月了,但我真的不明白一个和另一个之间有什么区别。 为什么有些人说一个或另一个更好或更差? 我在两者中做映射和注释的方式几乎相同……

也许你可以解决我的一些疑虑:

– 每个的优点和缺点是什么?

– Hibernate使用JPA还是相反(它们是否相互依赖)?

– 从function的角度来看,有哪些function没有另一个?

– 两者之间有其他差异吗?

JPA(Java Persistence API)是一个API,JPA 2.0是JSR 317组。 基本上,它是一个通过使用ORM(对象关系映射)来管理关系数据的框架,用于数据持久性。

Hibernate是一个ORM库,可将POJO / JavaBeans映射到数据持久性。 ORM和JPA都有一个对象/关系元数据(XML,Annotations),用于将POJO映射到DB表。

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。

JPA是持久性映射的API标准。 它是在Hibernate之后很久就开发出来的并且深受其影响。

要使用JPA,您需要JPA实现。 Hibernate是一个这样的JPA实现,因为它被扩展为实现它所启发的API。

此外,Hibernate提供了JPA标准不提供的一些function,但通常不需要这些function。

另一方面,如果您只使用JPAfunction,那么您的代码也应该使用不同的JPA实现 – 经验表明兼容性很少是100%,但切换到不同的实现不需要大量工作。

JPA是一个标准,由许多不同的库实现,例如TopLink。 Hibernate是一个早在JPA之前就存在的库,它具有JPA没有的一些function。

Criteria api在两者中,但我认为Hibernate的使用起来要简单得多。 因此,如果您使用JPA,您可以毫无问题地切换到不同的实现,或者您可能有一个定义基本JPA dao的基础项目和两个使用不同实现的不同项目。

如果您使用Hibernate,可能更容易找到示例和专家。

Hibernate是新现代JPA的灵感来源。 EJB 3.0 ORM( JPA )基于简单,干净,漂亮的Hibernate。

当JPA诞生时,Hibernate成为了JBoss的JPA实现基础。 因此,如果您使用的是JBoss和JPA,那么您可能正在使用Hibernate。

我无法发现一方面的任何重大优势。 也许最重要的是,如果您使用JPA,那么您使用的是纯JavaEE实现。 这意味着,理论上,您可以切换到不同的应用程序服务器,即使新的应用程序服务器没有使用Hibernate,您的应用程序仍然可以工作。 请记住,我在理论中说过。 🙂

JPA在某些应用程序服务器中使用Hibernate。 RedHat的JBoss是使用Hibernate实现JPA的主要产品。

我会尽可能简单地解释一下。

– 每个的优点和缺点是什么?

JPA属性是可移植的。 以javax.persistence开头的库与JPA相关联。 像hibernate这样的提供者提供了非便携式属性。 因此,最佳做法是尽可能使用javax.persistence。

– Hibernate使用JPA还是相反(它们是否相互依赖)?

JPA是对JDBC的抽象。 JPA是规范。 它需要一个提供者。 Hibernate是众多提供商之一。

– 从function的角度来看,有哪些function没有另一个?

Hibernate = ORM + JPA的实现因此你会在Hibernate中找到一些额外的function。

– 两者之间有其他差异吗?

在过去的几年里,Hibernate发生了很大的变化。 我发现JPA是一致的。 因此,如果不需要,尽可能尝试使用javax.persistence库。

interface JPA { void merge(Object o); } class Hibernate implements JPA { @Override public void merge(Object o) { // Implementation here } }