Java JPA与Hibernate注释的关系
我对Spring世界很陌生,我正在研究如何集成Hibernate和Spring框架 我对Hibernate注释和JPA注释之间的关系有些怀疑 当我有类似于以下实体类的东西时: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
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
AndreaHibernate是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,请仅包括
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。