对于多对多的关联,在设计表结构时采用表关联的方式。现在表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
)
事实上,多对多表的设计就是一对多设计时,采用表关联的扩展(参阅6.3.5小节)。只不过是在设计表关系时,去掉了address_id的唯一索引。这样就可以一个customer对应多个address,一个address又可以对应多个customer了。
当3个表中存在数据时,如图所示。
此时将表customer映射为CustomerEO实体,6.3.5小节中映射的类似,只不过这里使用@ManyToMany标记,代码如下所示。
@Entity
@Table(name = "customer")
public class CustomerEO implements java.io.Serializable {
……
private Collection<AddressEO> addresses = new ArrayList<AddressEO>();
@ManyToMany(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;
}
}
有关@JoinTable注释的使用请参阅6.3.6小节的内容。