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

相关文章
相关标签/搜索