一、一對多(@onetomany)
1、單向一對多模型
假設通過一個客戶實體可以獲得多個地址信息。
對於一對多的實體關系而言,表結構有兩種設計策略,分別是外鍵關聯和表關聯。
(1) 映射策略---外鍵關聯
在數據庫中表customer和表結構address定義,如下:
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), customer_id int(20), primary key (id) )
此時,表customer映射為實體CustomerEO,代碼如下:
@Entity @Table(name="customer") public class CustomerEO implements java.io.Serializable { @OneToMany(cascade={ CascadeType.ALL }) @JoinColumn(name="customer_id") private Collection<AddressEO> addresses = new ArrayList<AddressEO>(); ... }
(2) 映射策略---表關聯
在上面address表中去掉customer_id字段,在增加一個表ref_customer_address,如下: --客戶地址關系表
create table ref_customer_address ( customer_id int(20) not null, address_id int(20) not null unique )
此時表customer映射為CustomerEO實體,代碼如下:
@Entity @Table(name = "customer") public class CustomerEO implements java.io.Serializable { ... @OneToMany(cascade = { CascadeType.ALL }) @JoinTable(name="ref_customer_address", joinColumns={ @JoinColumn(name="customer_id",referencedColumnName="id")}, inverseJoinColumns={@JoinColumn(name="address_id",referencedColumnName="id")}) private Collection<AddressEO> addresses = new ArrayList<AddressEO>(); ... }
(3) 默認關聯
在數據庫底層為兩張表添加約束,如下:
create table customer_address ( customer_id int(20) not null, address_id int(20) not null unique ) alter table customer_address add constraint fk_ref_customer foreign key (customer_id) references customer (id); alter table customer_address add constraint fk_ref_address foreign key (address_id) references address (id);
這樣,在CustomerEO中只需要在標注@OneToMany即可!
二、多對一@ManyToOne
1、單向多對一模型。
(1) 外鍵關聯
配置AddressEO實體如下:
@Entity @Table(name="address") public class AddressEO implements java.io.Serializable { @ManyToOne(cascade = { CascadeType.ALL }) @JoinColumn(name="customer_id")//外鍵字段 private CustomerEO customer; // ... }
三、高級一對多和多對一映射
即雙向關聯模型,確定了雙向關聯后,多的一方AddressEO不變使用@ManyToOne,而CustomerEO實體修改為:
@Entity @Table(name="customer") public class CustomerEO { @OneToMany(mappedBy="customer") private Collection<AddressEO> addresses = new ArrayList<AddressEO>(); // ... }
其中,@OneToMany標記中的mappedBy屬性的值為AddressEO實體中所引用的CustomerEO實體的屬性名。
四、多對多(@ManyToMany)和一對多類似