對於mappedBy複習下:
a) 只有OneToOne,OneToMany,ManyToMany上才有mappedBy屬性,ManyToOne不存在該屬性;
b) mappedBy標籤一定是定義在the owned side(被擁有方的),他指向the owning side(擁有方);
c) mappedBy的含義,應該理解為,擁有方能夠自動維護 跟被擁有方的關係;
當然,如果從被擁有方,通過手工強行來維護擁有方的關係也是可以做到的。
d) mappedBy跟JoinColumn/JoinTable總是處於互斥的一方,可以理解為正是由於擁有方的關聯被擁有方的欄位存在,擁有方才擁有了被 擁有方。mappedBy這方定義的JoinColumn/JoinTable總是失效的,不會建立對應的欄位或者表
人跟身份證雙向關聯
在Person 裡面定義的註解:
@OneToOne(cascade={CascadeType.ALL},optional=true)
public IDCard getIdCard() {
return idCard;
}
在IDCard 裡面定義的注釋:
@OneToOne(cascade=CascadeType.ALL,mappedBy="idCard" , optional=false)
public Person getPerson() {
return person;
}
多了一個mappedBy這個方法,它表示什麼呢?它表示當前所在表和Person的關係是定義在Person裡面的idCard這個成員上面的,它表示此表是一對一關聯性中的從表,也就是關係是在person表裡面維護的 ,這一點很重要 . Person表是關係的維護者,owner side,有主導權,它有個外鍵指向IDCard。
我們也可以讓主導權在IDCard上面,也就是讓它產生一個指向Person的外鍵,這也是可以的,但是最好是讓Person來維護整個關係,這樣更符合我們正常的思維 .
我們也可以看到在Person裡面IDCard是注釋是optional=true,也就是說一個人是可以沒有身份證的,但是一個身份證不可以沒有人,所以在IDCard裡面注釋person的時候,optional就為false了,這樣就可以防止一個空的身份證記錄進資料庫.