什么是JPA和Hibernate之间的区别? [已关闭]
什么是JPA和Hibernate之间的区别? [已关闭]
我理解JPA 2是一个规范,Hibernate是一个ORM工具。此外,我也了解Hibernate比JPA 2拥有更多特性。但是从实际角度来看,它们之间的区别是什么呢?\n我有使用iBatis的经验,现在我正在尝试学习Hibernate或JPA2。我选择了《Pro JPA2》这本书,但它一直在提到“JPA提供者”。例如:\n
\n如果你认为某个特性应该被标准化,你应该向你的JPA提供者提出请求。\n
\n这让我感到困惑,所以我有几个问题:\n
- \n
- 仅使用JPA2,我是否可以通过简单地给我的POJO添加注解来从数据库中获取数据?
- JPA2是否应该与“JPA提供者”(如TopLink或Hibernate)一起使用?如果是这样,那么与仅使用JPA2相比,或与仅使用Hibernate相比,使用JPA2 + Hibernate的好处是什么?
- 你能推荐一本好的实用JPA2书籍吗?《Pro JPA2》似乎更像是一本关于JPA2的圣经和参考书(直到后半本才涉及查询)。有没有一本以问题/解决方法为主的JPA2书籍?
\n
\n
\n
JPA和Hibernate之间的区别是什么?
了解语言的历史背景和对JCP(Java Community Process,Java社区进程)的理解是理解这个问题的前提。
通常有第三方开发者开发的包用来执行某个功能或填补某个空缺,这些包并不是官方JDK的一部分。由于各种原因,这些功能可能通过JCP成为Java JDK的一部分。
Hibernate(2003年)提供了一种抽象SQL的方式,允许开发者更多地从对象持久化(ORM)的角度思考。你告诉Hibernate你的实体对象,它会自动生成持久化策略。Hibernate提供了实现这一功能的实现和通过XML配置或注释驱动实现的API。
现在的基本问题是,你的代码与特定供应商(Hibernate)紧密耦合,而很多人认为它应该更通用。因此需要一个通用的持久化API。
与此同时,JCP在Hibernate和其他ORM工具供应商的大量输入下,正在开发JSR 220(Java Specification Request),最终产生了JPA 1.0(2006年)和JPA 2.0(2009年)的JSR 317。这些是泛型Java持久化API的规范。该API以一组接口的形式提供在JDK中,以便您的类可以依赖于javax.persistence,而不必担心负责持久化对象的特定供应商。这只是API,而不是实现。Hibernate现在成为了实现JPA 2.0规范的众多供应商之一。您可以编码JPA,并选择适合您需求的符合规范的ORM供应商。
在某些情况下,Hibernate可能会为您提供在JPA中没有编码的特性。在这种情况下,您可以选择在类中直接插入一个Hibernate特定的注释,因为JPA没有提供执行此操作的接口。
JPA和Hibernate之间的区别是,Hibernate是一个实现了JPA规范的ORM工具供应商之一。JPA是一个泛型的Java持久化API规范,使您的类能够依赖于javax.persistence,而不必担心具体的ORM供应商。
JPA和Hibernate之间有什么区别?
这个问题的出现是因为有人对JPA和Hibernate之间的区别感到困惑。下面的回答和评论试图通过使用一些比喻和类比来解释这个区别。
有人说,JPA是舞蹈,Hibernate是舞者。这个比喻意味着JPA是一种规范,而Hibernate是一种实现该规范的工具。
还有人说,JPA是国际象棋,Hibernate是棋手。这个比喻暗示JPA是一种模板或规则,而Hibernate是根据这些规则来执行操作的工具。
还有人说,JPA是一个图形模板,而Hibernate是真正的手册。这个比喻没有增加理解。如果你已经知道区别,你可能会觉得它很有趣。如果你不知道区别,你仍然不会知道它。
然而,也有人认为这些比喻并没有解释清楚问题。他们认为这些比喻只是模糊地描述了JPA和Hibernate之间的关系。
最后,某些情况下了JPA是一个接口,而Hibernate是一个实现这个接口的类。这个说法更接近事实,因为JPA是Java Persistence API的缩写,而Hibernate是JPA的一个实现。
JPA是一种规范或接口,而Hibernate是一种实现这个规范的工具。通过使用JPA,开发人员可以编写与数据库无关的代码,而通过使用Hibernate,开发人员可以实现与数据库的交互。
JPA和Hibernate之间的区别是什么?
JPA只是一个规范,没有具体的实现。你可以使用JPA注解对类进行注解,但是如果没有具体的实现,什么都不会发生。可以将JPA看作是必须遵循的指导方针或接口,而Hibernate的JPA实现是符合JPA规范定义的API并提供底层功能的代码。
当你使用Hibernate和JPA时,实际上是在使用Hibernate的JPA实现。这样做的好处是你可以将Hibernate的JPA实现与其他JPA规范的实现交换。当你直接使用Hibernate时,你将锁定到该实现,因为其他ORM可能使用不同的方法/配置和注解,所以你不能轻易地切换到另一个ORM。
更详细的描述请阅读我的博客文章。
所以,当你使用Hibernate和JPA时,{java.persistence}注解将起作用,还是必须使用{org.hibernate}注解?
"meaning there is no implementation",但是有具体的类,因此我们可以使用javax.persistence.entityManager.persist。
我只想补充一点,用不同的ORM替换另一个ORM是非常少见的情况,所以你可能永远不会从使用JPA中获得这个好处。使用JPA带来的好处是一种协议、标准、命名和其他约定,可以用来与他人进行通信。
我同意,但原则上这是规范的一个卖点。
回答你的问题,当使用Hibernate和JPA时,{java.persistence}注解将起作用,不需要使用{org.hibernate}注解。
只要代码只使用了JPA中提到的接口,这是正确的。如果使用了Hibernate特定的功能,那么就必须使用org.hibernate
注解。更多信息请参考链接。