hibernate注解@manytoone,@onetomany


一、一對多(@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)和一對多類似

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM