对于同样的一对多的实体关系,在设计表结构时也可以采用表关联的方式。现在修改表customer和表address,并增加一个表ref_customer_address保存两个表的关系。表定义的结构SQL语句如下所示。
--客户表
CREATE TABLE customer (
id int(20) NOT NULL auto_increment,
name varchar(100) ,
PRIMARY KEY (id)
)
--地址表
CREATE TABLE address (
id int(20) NOT NULL auto_increment,
province varchar(50) ,
city varchar(50) ,
postcode varchar(50) ,
detail varchar(50) ,
PRIMARY KEY (id)
)
--客户地址关系表
CREATE TABLE ref_customer_address (
customer_id int(20) NOT NULL ,
address_id int(20) NOT NULL UNIQUE,
)
表ref_customer_address中的customer_id字段为表customer中的id的值,address_id为表address中的id的值。这样通过表ref_customer_address中的customer_id和address_id可以找到所关联的address表中的记录。通过限制address_id字段为唯一标识,可以保证一条address记录对应一个customer,客户和地址是一对多的关系。
当三个表中存在数据时,如图所示。
此时将表customer映射为CustomerEO实体,代码如下所示。
@Entity
@Table(name = "customer")
public class CustomerEO implements java.io.Serializable {
……
private Collection<AddressEO> addresses = new ArrayList<AddressEO>();
@OneToMany(cascade = { CascadeType.ALL })
@JoinTable(name="ref_customer_address",
joinColumns={
@JoinColumn(name="customer_id",referencedColumnName="id")
},
inverseJoinColumns={
@JoinColumn(name="address_id",referencedColumnName="id")
}
)
public Collection<AddressEO> getAddresses() {
return addresses;
}
public void setAddresses(Collection addresses) {
this.addresses = addresses;
}
}