JPA和Hibernate注解之间的关系

9

我是一个新手,在Spring世界中学习如何整合Hibernate和Spring框架。

我对Hibernate注解和JPA注解之间的关系有些疑惑。

当我有以下实体类时:

package org.andrea.myexample.HibernateOnSpring.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;


/* Classe che rappresenta un oggetto da persistere sul database
 * 
 */
@Entity
@Table(name="person")
public class Person {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int pid;

    private String firstname;

    private String lastname;

    public int getPid() {
        return pid;
    }

    public void setPid(int pid) {
        this.pid = pid;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }
}

我不理解的是Hibernate注释和JPA注释之间的关系。
在之前的例子中使用的注释@Entity、@Table(name="person")、@GeneratedValue(strategy=GenerationType.AUTO)和id,是简单的JPA注释还是特定于Hibernate的注释?
如果我使用JPA注释将数据持久化到数据库中,那么Hibernate会给我什么?
谢谢。
Andrea

5
JPA是一个API,hibernate提供了它的实现。 - guido
2
JPA提供了类似于接口或抽象类的东西,由Hibernate实现吗? - AndreaNobili
3
@AndreaNobili 确切地。 - Can Yegane
3个回答

26
答案是复杂的。
正如其他人指出的那样,JPA是一个规范,而Hibernate提供了一种实现方式。您使用JPA注释/API,并通过在类路径中包含Hibernate jar文件,Hibernate将提供实际逻辑。
此外,Hibernate还提供了一个与JPA无关的API。您也可以使用它;主要区别是:
- 如果您使用JPA API,您以后可以用其他JPA实现(例如EclipseLink)替换Hibernate,并且您的程序不需要更改。 - 如果您直接使用Hibernate API,则没有实现替代方案。优点可能是您可以使用Hibernate定义但不属于JPA标准的功能,这对您可能很有用。
无论如何,您应该完全避免将JPA与Hibernate API混合使用。作为初学者,我建议您坚持使用JPA。
为了确保您正在使用JPA,请仅包括来自java.persistence的类/注释。不要包含来自org.hibernate的任何内容(或者,如果您只想使用Hibernate,请做相反的操作)。

5
+1,尽管最后一部分是错误的。即使您使用具有专有API的Hibernate,也必须使用JPA注释。Hibernate不会重新实现JPA注释。 - JB Nizet
4
“你的程序不需要进行任何更改” - 我想知道是否有人发现这是100%真实的。 :) 对于这个回答点赞。 - Alex Barnes

9
Hibernate是JPA规范的一种实现。JPA仅仅是一种规范,包含一组注解和接口。要使用JPA,需要有其实现之一,而Hibernate就是其中之一。就像要使用JDBC一样,需要一个数据库驱动程序。
注解的包是javax.persistence,因此它们是JPA注解。Hibernate注解位于org.hibernate.xxx包中。

0
像@SJuan76所说,JPA(Java Persistence API)是一个规范,而Hibernate则是其中的一个实现。我同意其他人的观点;尽可能使用纯JPA。JPA规范很少更改,且更改通常向后兼容。这意味着您的代码将受到实现更改的保护。例如,如果您的代码不依赖于org.hibernate.*而依赖于javax.persistence.*,则可以自由升级Hibernate依赖项。
顺便说一下,Hibernate 5.3中JPA的版本为2.2。在此处阅读有关JPA的更多信息

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接