單向關係中的JoinColumn

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寫的是另外一個表在中間表的外鍵名稱。
相關文章
相關標籤/搜索