2014-03-30 127 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