8

我是 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?

肿瘤坏死因子

安德烈亚

4

3 回答 3

25

答案好坏参半。

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

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

  • 如果您使用 JPA API,您可以稍后用其他 JPA 实现(vg EclipseLink)替换 Hibernate,您将不需要更改您的程序

  • 如果您直接使用 Hibernate API,则没有实现替代方案。优点可能是您可以使用 Hibernate 已定义但不属于 JPA 标准的功能,这可能对您有用。

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

为确保您使用的是 JPA,请仅包含来自java.persistence. 不要包含任何来自org.hibernate(或者,如果您只想使用 Hibernate,则相反)。

于 2013-02-23T12:45:57.117 回答
8

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

注释的包是javax.persistence,所以它们是 JPA 注释。Hibernate 注释在包中org.hibernate.xxx

于 2013-02-23T12:38:32.467 回答
0

就像@SJuan76 所说,JPA(Java Persistence API)是一种规范,而 Hibernate 是一种实现。我同意其他人; 尽可能多地使用纯 JPA。JPA 规范不会经常更改,而且当它发生更改时,它通常是向后兼容的。这意味着您的代码将免受实施更改的影响。例如,如果您的代码不依赖于任何org.hibernate.*来自javax.persistence.*.

顺便提一句。从 Hibernate 5.3 开始,JPA 的版本为 2.2。在此处阅读有关 JPA 的更多信息

于 2019-02-12T05:41:20.637 回答