JPA和Hibernate注释之间的关系

时间:2013-02-23 12:35:14

标签: 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.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)和< strong> id 在前面的例子中使用的是简单的JPA注释或Hibernate的特定注释?

如果我使用JPA注释将数据保存到数据库,那么Hibernate会给我什么?

TNX

安德烈

3 个答案:

答案 0 :(得分:21)

答案是混合的。

正如其他人所指出的,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,请执行相反的操作)。

答案 1 :(得分:8)

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

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

答案 2 :(得分:0)

就像@ SJuan76所说,JPA(Java持久性API)是一种规范,而Hibernate是一种实现。我同意其他人;尽可能多地使用普通的JPA。 JPA规范不会经常更改,并且在执行时通常向后兼容。这意味着您的代码将受到保护,以免更改实现。例如,如果您的代码不依赖org.hibernate.*而是依赖javax.persistence.*的任何内容,则可以自由升级Hibernate依赖项。

顺便说一句。从Hibernate 5.3开始,JPA是2.2版。 Read more about JPA here