1.person與address的一對一單向關係:數據庫
在address中沒有特殊的註解。編程
在Person中對應到數據庫裏面就有一個指向Address的外鍵.app
咱們也能夠增長註釋指定外鍵的列的名字,以下:
@OneToOne(cascade=CascadeType.ALL,optional=true)
@JoinColumn(name="addressID")//註釋本表中指向另外一個表的外鍵。
public Address getAddress() {
return address;
}
若是咱們不加的話,也是能夠經過的,在JBOSS裏面,它會自動幫你生成你指向這個類的類名加上下劃線再加上id的列,也就是默認列名是:address_id.
若是是主鍵相關聯的話,那麼能夠運用以下注釋
@OneToOne(cascade={CascadeType.ALL})
@PrimaryKeyJoinColumn
public Address getAddress( ) {
return homeAddress;
}
它表示兩張表的關聯是根據兩張表的主鍵的spa
—————————————————————————————————————————————————————————————————————code
2.person和phone的一對多單向關係:orm
phone中沒有特別的註釋。get
person中:it
@OneToMany(cascade=CascadeType.ALL)@JoinColumn(name="personID")//註釋的是另外一個表指向本表的外鍵。public List<Phone> getPhones() { return phones; }
咱們能夠在Person類裏面發現@JoinColumn(name="personID")
它表明是一對多,一是指類自己,可能是指這個成員,也就是一個類能夠對應多個成員.
在一對多裏面,不管是單向仍是雙向,映射關係的維護端都是在多的那一方,也就是Phone那裏,由於要在數據庫面表現的話,也只有讓Phone起一個指向Person的外鍵,不可能在Person裏面指向Phone,這一點和一對一不同,一對一能夠在任意一方起一個外鍵指向對方.但是一對多卻不行了.io
在這裏@JoinColumn這個註釋指的倒是在Phone裏面的外鍵的列的名字,List
它並不像在一對一里面的註釋指的是本身表裏面的外鍵列名.這一點要特別注意一下.
若是是一對多的雙向關係,那麼這個註釋就要應用到多的那邊去了,雖然註釋還在Person類裏面,可是它起的效果倒是在Phone裏面起一個叫personID的外鍵, 由於多的那邊要有外鍵指向少的這邊.
若是你不加 @JoinColumn(name="personID")這個註釋的話,那麼JBOSS就會自動幫你生成一張中間表,
它負現Person和Phone表之間的聯繫.它將會作以下事情:
CREATE TABLE PERSON_PHONE ( PERSON_id INT, PHONE_id INT);ALTER TABLE PERSON_PHONE ADD CONSTRAINT person_phone_unique UNIQUE (PHONE_id);ALTER TABLE PERSON_PHONE ADD CONSTRAINT personREFphone FOREIGN KEY (PERSON_id) REFERENCES PERSON (id);ALTER TABLE PERSON_PHONE ADD CONSTRAINT personREFphone2 FOREIGN KEY (PHONE_id) REFERENCES PHONE (id);
因此咱們最好仍是指定一下,以讓程序產生更加肯定的行爲,不過通常是推薦另外生成一箇中間表好一些,由於這樣的話,對原來兩張表的結構不對形成任何影響。在遺留系統的時候不少用,有些時候,一些表都是之前就建好了的,要改表的結構是不太可能的,因此這個時候中間的表就顯得很重要了,它能夠在不侵入原來表的狀況下構建出一種更清淅更易管理的關係。
因此一對多的單向關聯,咱們仍是推薦使用一張中間表來創建關係。
---------------------------------------------------------------------------------------------------------------------------------------------
3.person和country的多對一單向關係:
country中無特別的註解。
而person註解以下:
@ManyToOne@JoinColumn(name="countryID") public Country getCountry() { return country; }在一對多一對多一對的關係裏面,關係的維護端都是在多的那一面,多的一面爲主控方,擁有指向對方的外鍵。
由於主控端是Person .外鍵也是建在Person上面,由於它是多的一面。固然咱們在這裏也能夠省掉@JoinColumn,那樣的話會怎麼樣呢,會不會像一對多單向同樣生成中間的表呢?事實是不會的,在這裏若是咱們去掉@JoinColumn的話,那麼同樣會在Person表裏面生成一列指向
Country的外鍵,這一點和一對多的單向是不同,在一對多的單向裏面,若是咱們不在Person 裏面加上@JoinColumn這個註釋,那麼JBOSS將會爲咱們生成一箇中間的表,這個表會有一個列指向Person主鍵,一個列指向Phone主鍵。因此說爲了程序有必定的行爲,有些東西咱們仍是不要省的好。
其實多對一單向是有點向一對一單向的,在主控端裏面,也就是從Person的角度來看,也就是對應了一個Country而已,只不過這個Country是不少Person所共用的,而一對一卻沒有這一點限制。
------------------------------------------------------------------
4.person和project的多對多單向關係:
project沒有特殊的註解。
person:
@ManyToMany
public List<Project> getProjects() { return projects; }
它須要設置中間表來維護關係,在數據庫上跟多對多雙向,只不過在編程的邏輯中不同而已。
//相似這個:@JoinTable(name = "PersonANDFlight", joinColumns = {@JoinColumn(name = "personID")},
//inverseJoinColumns = {@JoinColumn(name = "flightID")})
其實這個聲明不是必要的,當咱們不用@JoinTable來聲明的時候,JBOSS也會爲咱們自動生成一個鏈接用的表,
表名默認是主控端的表名加上下劃線"_"再加上反轉端的表名.
相似
@ManyToMany(cascade = CascadeType.ALL) @JoinTable(name = "PersonANDFlight",
joinColumns = {@JoinColumn(name = "personID")},
inverseJoinColumns = {@JoinColumn(name = "flightID")}) public List<Flight> getFlights() { return flights; }
-------------------------------------------------------------------------
在單向關係中沒有mappedBy,主控方至關於擁有指向另外一方的外鍵的一方。
1.一對一和多對一的@JoinColumn註解的都是在「主控方」,都是本表指向外表的外鍵名稱。
2.一對多的@JoinColumn註解在「被控方」,即一的一方,指的是外表中指向本表的外鍵名稱。
3.多對多中,joinColumns寫的都是本表在中間表的外鍵名稱,
inverseJoinColumns寫的是另外一個表在中間表的外鍵名稱。