据我所知,Hibernate 有两种类型的实现
- JPA的实现(二)(@Entity,@Table注解)
- 对旧(常规)休眠(没有 JPA)的扩展,使用 HSQL 查询,没有注释
如果是真的,为什么我们需要第二种类型的实现,而 JPA 是 ORM 规范?如果您可以在比较它们的同时提供 API 版本,那么我了解 ORM 的整个评估历史会更好吗?谢谢。
在 JPA 规范之前,Hibernate 是最早的 ORM 工具之一。它也是 Java 5 之前的开发者(当注释在 Java 中可用时),所以一切都曾经是基于 XML 配置或 XDoclet。
对 Java EE 进行了重大改进,它大量借鉴了 Spring 和 Hibernate,引入了 JPA,但也足够“通用”,您可以插入自己的实现。
hibernate 的工作方式没有真正的区别,只是你使用什么机制来配置它。JPA 注释现在是标准,但您仍然可以仅在需要时使用 XML。
没有两种不同的 Hibernate 实现——只有一种官方实现。您可以通过注解/JPA 功能使用 Hibernate,也可以通过显式 Hibernate 类使用 Hibernate;但是底层的 Hibernate 库将是相同的。
JPA 只是 Hibernate(和其他类似库)实现的接口。
历史告诉我们,早在九十年代后期,就有人发明了 EJB。Java 社区的共识是没有人喜欢它,许多人只是使用 Hibernate 或类似的框架。直到 EJB 3.0,EJB 的持久性几乎根据 Hibernate 的工作方式进行建模(注意 EJB 中还有其他类型的 bean,不仅是数据映射)。
据我所知,Hibernate 中的注释是从 3.2 版左右开始引入的;而且我不是在谈论 JPA 注释(javax.persistence 包),而是可以在 hibernate-annotations 包中找到的特定于休眠的注释。
几乎所有你可以用特定于休眠的注解做的事情,现在你也可以用 JPA2 做。
如前所述,JPA 只是一个接口,当您对该接口进行编码时,您(至少在理论上)将底层 ORM 提供程序替换为另一个提供程序会更容易,例如 TopLink、OpenJPA 或 Eclipselink(如果您需要)