7.1.1 两个表映射为一个实体

下面有以下这样一个需求,有两个表员工表(tb_employee)和合同表(tb_contatct),两个表通过员工的idemployee_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;

         }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值