正文
采用这种方式,JPA时限会通过调用Getter/Setter来对实体对象的字段进行操作。还是一样,通过@Id注解来定义:
@Entity
public class Person {
private int id;
private String name;
@Id
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getNickname() { return nickname; }
public void setNickname(String nickname) { this.name = nickname; }
}
此时将@Id放在了Getter上。另外,还注意到在访问name字段的时候,使用的Getter和Setter的方法名称分别是getNickname以及SetNickname。因此在数据库表中使用的列名实际上是nickname,而非实体类中的字段名称name。但是这并不是说在基于Field的访问方式中不能做到字段名和列名不同,通过@Column显式定义即可。
混合模式
如果混合使用了Field和Property的访问方式,就是所谓的混合模式。通过@Access注解进行指定,这是JPA2.0之后添加的新功能。
利用它,可以完成一些从数据表列到实体字段之间基本的转换操作。比如下面这个例子:
@Entity
@Access(AccessType.FIELD)
public class Employee {
public static final String LOCAL_AREA_CODE = "613";
@Id
private int id;
@Transient
private String phoneNum;
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getPhoneNumber() { return phoneNum; }
public void setPhoneNumber(String num) { this.phoneNum = num; }
@Access(AccessType.PROPERTY)
@Column(name="PHONE")
protected String getPhoneNumberForDb() {
if (phoneNum.length() == 10)
return phoneNum;
else
return LOCAL_AREA_CODE + phoneNum;
}
protected void setPhoneNumberForDb(String num) {
if (num.startsWith(LOCAL_AREA_CODE))
phoneNum = num.substring(3);
else
phoneNum = num;
}
}
}
通过上述代码来讨论一下使用混合访问模式的几个条件: