JPA中@Access註解小結

JPA規範中能夠經過@Access註解的來指定實體類的訪問策略。app

/**
 * Used to specify an access type to be applied to an entity class,
 * mapped superclass, or embeddable class, or to a specific attribute
 * of such a class.
 *
 * @since Java Persistence 2.0
 */
@Target( { TYPE, METHOD, FIELD })
@Retention(RUNTIME)
public @interface Access {

    /**
     * (Required)  Specification of field- or property-based access.
     */
    AccessType value();
}

@Access註解中能夠接收兩種AccessType類型的值:AccessType.FIELD和AccessType.PROPERTY。ui

AccessType.FIELD指經過類中的字段來獲取對應的表字段信息。此時,JPA只關注類中的字段名,並轉換爲對應的表字段信息,而不會讀取getter方法和setter方法上的表字段註解信息。如:this

@Entity 
@Table(name="t_user") 
@Access(AccessType.FIELD)
public class User implements Serializable { 
    private static final long serialVersionUID = 1L; 
   
    @Id 
    @GeneratedValue 
    private Long id; 
    @Column(name="name", length=30) 
    private String name; 
    @Column(name="age", nullable=false) 
    private int age; 
    
    public Long getId() { 
        return id; 
    } 
 
    public void setId(Long id) { 
        this.id = id; 
    } 

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

    public int getAge() { 
        return age; 
    } 
 
    public void setAge(int age) { 
        this.age = age; 
    } 
}

AccessType.PROPERTY指經過類中的getter方法和setter方法來獲取對應的表字段信息。此時,JPA只關注類中getter方法和setter方法上的表字段註解信息,並轉換爲對應的表字段信息。如:code

@Entity 
@Table(name="t_cat") 
@Access(AccessType.PROPERTY)
public class Cat implements Serializable { 
    private static final long serialVersionUID = 1L; 
   
    private Long id; 
    private String name; 

    @Id 
    @GeneratedValue 
    public Long getId() { 
        return id; 
    } 
 
    public void setId(Long id) { 
        this.id = id; 
    } 

    @Column(name="name", length=30) 
    public String getName() { 
        return name; 
    } 
 
    public void setName(String name) { 
        this.name = name; 
    } 
}

JPA的關聯規則能夠根據喜愛而任選其一進行配置使用,在對應生成表字段信息時沒有區別。從@Access註解的@Target配置信息中可知其能夠配置在類,字段或方法上。以此來知足不一樣場景下表字段信息的掃描規則需求。如:ci

@Entity 
@Table(name="t_employee") 
@Access(AccessType.FIELD)
public class Employee implements Serializable { 
    private static final long serialVersionUID = 1L; 
   

    @Id 
    @GeneratedValue 
    private Long id; 
    private String name; 

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

    @Access(AccessType.PROPERTY)
    @Column(name="name", length=30) 
    public String getName() { 
        return name; 
    } 
 
    public void setName(String name) { 
        this.name = name; 
    } 
}

在默認狀況下,JPA會自動識別@Id註解的配置方式,並以此來選擇對應的表字段信息的掃描規則。get

相關文章
相關標籤/搜索