2016-09-29 233 views
3

我是UML圖中的新手,並希望使用JPA註釋對以下OneUOne雙向雙向關聯進行編碼。OneToOne雙向雙向關聯

Double OneToOne association

語境:有個人和團隊。每個團隊由人組成,每個人只能屬於一個團隊。團隊總是有一個人擔任主要領導者,並可以選擇第二個領導者。

基於這個page,我寫了下面的代碼,但我不確定它是否正確。

@Entity 
public class Person extends BaseEntity { 

... 

    @NotNull 
    @OneToOne(mappedBy="mainLeader", cascade = CascadeType.ALL, orphanRemoval = true) 
    private Team mainTeam; 

    @NotNull 
    @OneToOne(mappedBy="secondLeader", cascade = CascadeType.ALL, orphanRemoval = true) 
    private Team secondTeam;  
} 

@Entity 
public class Team extends BaseEntity { 

... 

    @NotNull 
    @OneToOne 
    private Person mainLeader; 

    @OneToOne 
    private Person secondLeader;  
} 
+0

感覺就像你在尋找雙向關係,但問題不是很清楚。你試圖將mainTeam和secondTeam映射到一個領導?你打算以簡單的方式做什麼? –

+0

@mujibishola我想用JPA註釋編碼這個雙重關聯。就這些。 – julian

+0

這不是一個雙重關聯。 '人'只需要知道一個'團隊'。你不會說明它是如何與'main'和'second'' Team'關聯的。 – ChiefTwoPencils

回答

3

關聯名稱暗示要使用的角色。 Main Leader可能對應於角色mainLeader。所以我只想在Team中創建一個屬性。

但是由於這些關聯只是被命名並且沒有角色,所以您可以根據需要創建角色。這應該從上下文中得出。

0

您的實體類代碼與兩個一對一雙向關聯的JPA註釋的相互引用屬性看起來相當不錯。只有您的班級圖表看起來不太好,因爲您沒有使用參考屬性的名稱(例如mainLeader)作爲相應的關聯結束,並且不使用關聯最終所有權點來指示關聯結束將作爲另一側的類中的對應屬性來實現。

您可以在開放接入書大廈後端Web應用程序與Java,JPA和JSFChapter 15爲雙向關聯下面的例子。

Two bidirectional associations

Publisher類,我們添加publishedBooks屬性,我們使用來自Book類對應於@ManyToOne@OneToMany註釋,代表逆關係:

@Entity 
public class Publisher { 
    ... 
    @OneToMany(fetch=FetchType.EAGER, mappedBy="publisher") 
    private Set<Book> publishedBooks; 
    ... 
} 

的的mappedBy參數@OneToManyPublisher :: publishedBooks的註釋屬性指定在中實現@ManyToOne關係的屬性類:

@Entity 
public class Book { 
    ... 
    @ManyToOne(fetch=FetchType.EAGER) 
    @JoinColumn(name="PUBLISHER_NAME") 
    private Publisher publisher; 
    ... 
} 

在作者類中,我們添加authoredBooks屬性對應於@ManyToMany@ManyToMany註釋從Book類表示反向關係:

@Entity 
public class Author { 
    ... 
    @ManyToMany(fetch=FetchType.EAGER, mappedBy="authors") 
    private Set<Book> authoredBooks; 
    ... 
} 

@ManyToMany標註爲mappedBy財產Author :: authoredBooks指定了屬性name,該屬性實現了Book類中的@ManyToMany關係:

@Entity... 
public class Book { 
    ... 
    @ManyToMany(fetch=FetchType.EAGER) 
    @JoinTable(name="books_authors", 
    joinColumns = { @JoinColumn(name="BOOK_ISBN") }, 
    inverseJoinColumns = { @JoinColumn(name="AUTHOR_PERSONID") }) 
    private Set<Author> authors; 
    ... 
} 

我們還用@JoinTable批註指定爲MNY一對多的關係,併爲連接表中相應的列名(例如,表是books_authors,列被命名爲BOOK_ISBNAUTHOR_PERSONID連接表的名稱)。

-1

我認爲這個解決方案可能更適合於描述模型。

@Entity 
    public class Person extends BaseEntity { 

      ... 

      @NotNull 
      @OneToOne 
      private Team team;   
     } 

     @Entity 
     public class Team extends BaseEntity { 

      ... 

      @NotNull 
      @OneToOne(mappedBy="team", cascade = CascadeType.ALL, orphanRemoval = true) 
      private Person mainLeader; 

      @OneToOne(mappedBy="team", cascade = CascadeType.ALL, orphanRemoval = true) 
      private Person secondLeader;  
     } 
+0

你的代碼不是「更合適」,而是把它搞亂! (1)不能將兩個不同的引用屬性(mainLeader和secondLeader)鏈接到相同的反轉屬性。 (2)你的'Person' ::'team'屬性表示一個團隊成員關係,而'Team' ::'mainLeader'(和'secondLeader')屬性表示領導關聯。 –

+0

@gwag我不知道它是否正確。我正在嘗試並等待適合uml圖的解決方案。 – julian

+0

但是你在你的問題中提供的代碼確實符合你的類圖。如果你的類圖是以正確的方式完成的話,那麼只有一些問題(比如強制性的,而不是可選的關聯在'Team'端)。 –