专栏名称: ImportNew
伯乐在线旗下账号,专注Java技术分享,包括Java基础技术、进阶技能、架构设计和Java技术领域动态等。
目录
相关文章推荐
51好读  ›  专栏  ›  ImportNew

JavaEE – JPA(5):ORM的核心注解 – 访问方式,表映射以及主键生成

ImportNew  · 公众号  · Java  · 2016-12-16 21:04

正文

请到「今天看啥」查看全文



采用这种方式,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;

}

}

}


通过上述代码来讨论一下使用混合访问模式的几个条件:







请到「今天看啥」查看全文