簡體   English   中英

OneToOne雙向雙向關聯

[英]OneToOne Double Bidirectional Association

我是UML圖的新手,想要編寫下面的代碼,其中有一個OneToOne雙向雙向關聯,帶有JPA注釋。

Double OneToOne協會

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

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

@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;    
}

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

但由於這些關聯只是被命名並且沒有角色,所以您可以在願望中創建角色。 這應該來自上下文。

具有JPA注釋的兩個一對一雙向關聯的相互引用屬性的實體類代碼看起來非常好。 它只是你的類圖看起來不太好,因為你不使用引用屬性的名稱(例如mainLeader )用於相應的關聯結束,並且你不使用關聯結束所有權點來表示關聯end將作為另一側的類中的相應屬性實現。

您可以在開放式訪問書“ 使用Java,JPA和JSF構建后端Web應用程序”的 第15章中找到以下雙向關聯示例。

兩個雙向關聯

Publisher類,我們添加publishedBooks財產,我們使用@OneToMany相應注釋@ManyToOneBook類,代表着反比關系:

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

Publisher :: publishedBooks屬性的@OneToMany批注的mappedBy參數指定在Book類中實現@ManyToOne關系的屬性:

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

在筆者類中,我們添加authoredBooks屬性與@ManyToMany相應注釋@ManyToManyBook表示反向關系類:

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

Author :: authoredBooks@ManyToMany批注的mappedBy屬性指定了在Book類中實現@ManyToMany關系的屬性name

@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注釋來指定@JoinTable -to-many關系的連接表名稱以及連接表的相應列名稱(例如,表是books_authors ,列名為BOOK_ISBNAUTHOR_PERSONID )。

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

   @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;    
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM