2014-03-30 76 views
0

在下面的java实体bean类中,我们使用了@Id和其他注释。它们来自javax.persistence。*包。我看了SO和其他论坛,每个人都说,JPA是规范/规则集,而Hibernate是JPA实现之一。如果是这样,JPA如何提供这些类/接口,如@Id(发生器接口)。hibernate相当于javax.persistence。*注释

如果我理解正确,JPA本身提供了在不使用Hibernate的情况下支持ORM的功能?我想知道 1)Hibernate注释类对应于这些JPA注解 - @ Id。 2)对于javax.persistence。*包,我们是否需要使用Hibernate-Annotations jar?或者他们来自JPA特定的jar包,如果有的话请帮我理解包的名字。

import java.io.Serializable; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table(name = "employee") 
public class Employee implements Serializable { 
    public Employee() { 

    } 
    @Id 
    @Column(name = "id") 
    Integer id; 

    @Column(name = "name") 
    String name; 

    public Integer getId() { 
    return id; 
    } 

    public void setId(Integer id) { 
    this.id = id; 
    } 

    public String getName() { 
    return name; 
    } 

    public void setName(String name) { 
    this.name = name; 
    } 

} 

回答

1

注解基本上是没有实现的接口。 JPA是一个API的规范,它不是一个实现。 JPA API可以通过注释来访问。 JPA说应该做什么,而不是应该如何做。

具体的实现,如Hibernate或EclipseLink,将在编译时和运行时使用注释来实现该功能。因此,注释是实现在何处挂钩其自己的代码或如何处理某些对象的标记。因此,在使用JPA时,Hibernate中不需要相应的注释。注释应该是标准注释,以便Hibernate能够识别它们。

如果您使用供应商特定的注释,则使用不同的API。这个不同的API甚至可能使用相同的实现,但您可以用不同的方式访问它。当提供JPA无法提供且您需要的功能时,使用供应商特定的API和供应商特定的注释非常有用。特别是在JPA 2.0之前,Hibernate提供了比标准更多的东西,所以使用供应商特定的API并不罕见。

+0

谢谢@他,我明白了。不知道为什么SO没有提供接受所有正确答案的条款!! :) – user3448119

+0

SO的想法是关于一个正确的,最好的答案。有时候,这个原则的效果不好。但你总是可以赞成其他有用的答案。 –

+0

你是对的。但是,如果像我这样名声较低的用户无法登录! – user3448119

2

JPA是规定:实体类是用@ javax.persistence.Entity注释的类。它必须有一个使用@ javax.persistence.Id注释的字段或getter。

Hibernate实现了规范所说的内容。所以它使用标准的JPA注释。如果它使用专有注释,它不会遵守规范。如果规范没有定义任何注释,则每个实现都必须定义自己的专有注释,并且不可能编写适用于该标准各种实现的JPA代码。

+0

谢谢@JB Nizet,我明白了。你可以在我的更新后的帖子中帮助我解决问题2):2)对于javax.persistence。*包,我们是否需要使用Hibernate-Annotations jar?或者他们来自JPA特定的jar包,如果有的话请帮我理解包的名字。 – user3448119

+0

但在这个例子中,我们没有使用hibernate,对吗?我的例子可以被认为是纯粹的JPA例子吗? – user3448119