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 } }