一對多(One-to-Many)
使用@OneToMany批注可定義一對多關聯,一對多關聯可以是雙向關聯。
在EJB3規范中多對一這端幾乎總是雙向關聯中的主體(owner)端,而一對多這端關聯批注為@OneToMany(mappedBy...)
@Entity
Public class Troop{
@OneToMany(mappedBy=”troop”)
Public Set<Soldier> getSoldiers(){
......
}
@Entity
Public class Soldier{
@ManyToOne
@JoinColumn(name=”troop_fk”)
Public Troop getTroop(){
......
}
Troop通過troop屬性和Soldier建立一對多的雙向關聯,在mappedBy端不必也不能再定義任何物理映射。
對于一對多的雙向映射,如果要一對多這一端維護關聯關系,你需要刪除mappedBy元素并將多對一這端的@JoinColoumn的insertable和updatabel設置為false。這種方案不會得到什么明顯的優化,而且還會增加一些附加的UPDATE語句。
單向:
通過在被擁有的實體端(owned entity)增加一個外鍵列來實現一對多單向關聯是很少見的,也是不推薦的,建議通過一個聯接表來實現這種關聯(下面會講到)。
@JoinColoumn批注來描述這種單向關聯關系
@Entity
Public class Customer{
@OneToMany
@JoinColoumn(name=”CUST_ID”)
Public Set<ticket> getTickets() {
.....
}
@Entity
Public class Ticket{
...
}
Customer通過CUST_ID列和Ticket建立了單向關聯關系
通過關聯表處理單向關聯:
通過聯接表處理單向一對多關聯是首選方式,這種關聯通過@JoinTable批注進行描述
@Entity
Public class Trainer{
@OneToMany
@JoinTable(
name = "TrainedMonkeys",
jonColumns = {@JoinColumn(name="trainer_id"},
inverseJoinColumns = @JoinColumn(name = "monkey_id")
)
public Set<Monkey> getTrainedMonkeys() {
return trainedMonkeys;
}
......
}
@Entity
public class Monkey {
...//no bidir
}
上面這個例子中,Trainer通過TrainedMonkeys表和Monkey建立了單向關聯,其中外鍵trainer_id關聯到Trainer(joinColoumn),而外鍵monkey_id關聯到Monkey(inversejionColoumns)
默認處理機制:
通過聯接表來建立單向一對多關聯不需要描述任何物理映像,表名由以下三個部分組成:主表(ownertable)表名+從表(the other side table)表名,指向主表的外鍵名:主表表名+下劃線+主表主鍵列名,指向從表的外鍵名:主表所對應實體的屬性名+下劃線+從表主鍵列名,指向從表的外鍵定義為唯一約束,用來表示一對多的關聯關系。
@Entity
public class Trainer{
@OneToMany
Public Set<Tiger> getTrainedTigers(){
... ...
}
@Entity
public class Tiger{
.. ..//no bidir
}
上面這個例子中,Trainer和Tiger通過聯接表Trainer_Tiger建立單向關聯關系,其中外鍵trainer_id關聯到Trainer,而外鍵trainedTigers_id關聯到Tiger