下面有以下这样一个需求,有两个表员工表(tb_employee)和合同表(tb_contatct),两个表通过员工的id(employee_id)关联。现在只需要将两个表映射为一个实体类,员工实体类。员工实体类中的属性除了员工表中的字段外,员工实体的其他的属性为对应合同表中的字段。这时,要映射的员工表叫做主表,合同表叫做从表。
员工实体与员工表、合同表的结构示意图如图所示。
两个表“tb_employee”员工表和“tb_contract”员工合同表.表结构定义的SQL脚本如以下所示:
--员工表
CREATE TABLE tb_employee (
id int(20) NOT NULL auto_increment,
name varchar(255) ,
PRIMARY KEY (id)
);
--员工合同表
CREATE TABLE tb_contract (
id int(20) NOT NULL auto_increment,
content varchar(255) ,
create_date date,
expired_date date,
employee_id int(20),
PRIMARY KEY (id)
);
当这两个表中存在数据时,如图所示。
一个员工可以有一份对应的合同,但合同表并不需要映射为一个实体,而是可以作为员工实体的属性。
若满足这样的需求,映射的员工实体的代码如下所示:
/**员工实体*/
@Entity
/**主表为tb_employee员工表*/
@Table(name = "tb_employee")
/**
* 从表为tb_contract合同表,
* tb_contract表中的employee_id关联tb_employee的主键
*/
@SecondaryTable(
name = "tb_contract",
pkJoinColumns = { @PrimaryKeyJoinColumn(name = "employee_id") }
)
public class EmployeeEO implements Serializable {
public EmployeeEO() {
}
private Integer id;
/** 主键,员工ID */
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
private String name;
/** 员工名称 */
@Column(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String contContent;
/** 员工合同内容 */
@Column(name="content",table = "tb_contract")
public String getContContent() {
return contContent;
}
public void setContContent(String contContent) {
this.contContent = contContent;
}
private Date contCreateDate;
/** 合同签订日期 */
@Column(name = "create_date", table = "tb_contract")
public Date getContCreateDate() {
return contCreateDate;
}
public void setContCreateDate(Date contCreateDate) {
this.contCreateDate = contCreateDate;
}
private Date contExpiredDate;
/** 合同到期日期 */
@Column(name = "expired_date", table = "tb_contract")
public Date getContExpiredDate() {
return contExpiredDate;
}
public void setContExpiredDate(Date contExpiredDate) {
this.contExpiredDate = contExpiredDate;
}
}
在映射带有主表和从的从表的实体时,注意以下几个方面。
l 实体中的主表映射的部分不变,与单表映射时相同。
l 实体中的从表要使用@ SecondaryTable注释声明,有关@ SecondaryTable的用法将在下一小节详细讲述。
l 实体中的从表的字段在使用@Column注释时,要指定从表的表名,例如以下代码所示:
/** 合同到期日期 */
@Column(name = "expired_date", table = "tb_contract")
public Date getContExpiredDate() {
return contExpiredDate;
}