2017-04-06 41 views
0

Spring Boot和JPA的新特性。我見過的現場聲明,如該添加JPA註釋的例子:將JPA註釋添加到字段與getter之間的區別?

@Entity 
public class Fizz { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    // other fields 

    public Fizz(Long id) { 
     super(); 

     setId(id); 
    } 

    // setter defined here 

    public Long getId() { 
     return this.id; 
    } 
} 

...以及實例將相同的註解的getter方法是這樣的:

@Entity 
public class Fizz { 
    private Long id; 

    // other fields 

    public Fizz(Long id) { 
     super(); 

     setId(id); 
    } 

    // setter defined here 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    public Long getId() { 
     return this.id; 
    } 
} 

我想知道它們在語義上是否相同,或者是否有不同的用例可以選擇其中一種。我問,因爲我確實寫我的春節,啓動/ JPA應用在Groovy中,你通常不會定義干將:

@Canonical 
@Entity 
class Fizz { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    Long id 
} 

任何想法?提前致謝!

+0

你還在尋找澄清?如果不是,那麼你能否考慮接受下面的答案,並提高它? –

回答

1

默認情況下,JPA提供程序使用實體的JavaBean屬性訪問器(getter)和增變(setter)方法訪問實體字段的值並將這些字段映射到數據庫列 。因此,實體中私有字段的名稱和類型與JPA無關。相反,JPA只查找 JavaBean屬性訪問器的名稱和返回類型。您可以使用@javax.persistence.Access註釋來更改此註釋,這使您可以明確指定JPA提供程序應使用的訪問方法 。

@Entity 
@Access(AccessType.FIELD) 
public class SomeEntity implements Serializable 
{ 
... 
} 

的接入類型枚舉可用的選項是PROPERTY(默認)和FIELD。通過 PROPERTY,提供者使用JavaBean屬性方法獲取並設置字段值。 FIELD使得 提供者使用實例字段獲取和設置字段值。作爲最佳實踐,您應該將 保留爲默認值,並使用JavaBean屬性,除非您有一個令人信服的理由否則。

您 可以將這些屬性註釋放在私有字段或公共存取方法中。如果 使用AccessType.PROPERTY(默認值)並註釋專用字段而不是JavaBean 訪問器,則字段名稱必須與JavaBean屬性名稱匹配。但是,如果註釋了JavaBean訪問器,名稱不必 必須匹配。同樣,如果使用AccessType.FIELD和 註釋JavaBean訪問器而不是字段,則字段名稱還必須與JavaBean 屬性名稱匹配。在這種情況下,如果您註釋字段,則不必匹配。最好是 應該一致並標註出AccessType.PROPERTY的JavaBean訪問器和 AccessType.FIELD的字段。

您不應該在同一個實體中混合使用JPA屬性註釋和JPA字段註釋 。這樣做會導致不確定的行爲,並且很可能導致錯誤。

相關問題