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