Java JPA与Hibernate注释的关系

Java JPA与Hibernate注释的关系,java,spring,hibernate,jpa,spring-mvc,Java,Spring,Hibernate,Jpa,Spring Mvc,我对Spring世界很陌生,我正在研究如何集成Hibernate和Spring框架 我对Hibernate注释和JPA注释之间的关系有些怀疑 当我有类似于以下实体类的东西时: package org.andrea.myexample.HibernateOnSpring.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Generat

我对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的作用是什么

Tnx


Andrea

Hibernate是JPA规范的一个实现。JPA只是一个规范,一组注释和接口。您需要一个JPA实现来使用它,Hibernate就是其中之一。就像使用JDBC一样,您需要一个数据库驱动程序

注释的包是
javax.persistence
,因此它们是JPA注释。Hibernate注释在包
org.Hibernate.xxx

中,答案是混合的

正如其他人所指出的,JPA是一种规范,Hibernate提供了一种实现。您使用JPA注释/API,通过在类路径中包含Hibernate JAR,Hibernate将提供实际的逻辑

此外,Hibernate提供了一个与JPA无关的API。你也可以用它;主要区别在于:


  • 如果您使用JPAAPI,以后可能会用其他JPA实现(v.g.EclipseLink)替换Hibernate,并且您不需要对程序进行任何更改

  • 如果您直接使用HibernateAPI,那么就没有其他实现方法。优点可能是您可以使用Hibernate定义的特性,但这些特性不是JPA标准的一部分,这可能对您有用

无论如何,您应该完全避免将JPA与HibernateAPI混合使用。作为初学者,我建议你坚持JPA


为了确保您使用的是JPA,请仅包括
java.persistence
中的类/注释。不要包含任何来自
org.hibernate
(或者,如果您只想使用hibernate,请执行相反的操作)。

正如@SJuan76所说,JPA(Java持久性API)是一种规范,hibernate是一种实现。我同意其他人的看法;尽可能多地坚持使用普通JPA。JPA规范不会经常更改,当它更改时,通常是向后兼容的。这意味着您的代码将受到保护,不受实现更改的影响。例如,如果您的代码不依赖于
org.Hibernate.*
中的任何内容,而是依赖于
javax.persistence.*
中的任何内容,那么您可以自由升级Hibernate依赖项


顺便说一句,JPA在Hibernate 5.3的2.2版中

JPA是一个API,hibernate提供了一个实现。所以JPA提供了一些类似于hibernate?@AndreaNobili+1实现的接口或抽象类的东西,尽管最后一部分是不正确的。即使您将Hibernate与其专有API一起使用,也必须使用JPA注释。Hibernate没有重新实现JPA注释。“您的程序不需要更改”-我想知道是否有人发现这是100%正确的。:)+答案是1。