2016-09-29 17 views
3

私は初心者向けのUMLダイアグラムで、JPOアノテーションを使用してOneToOne二重双方向結合がある場合、次のコードを作成したいと考えています。OneToOne Double双方向結合

Double OneToOne association

コンテキスト:個人とチームがあります。各チームは人で構成され、各人は1つのチームにしか属しません。チームは常にメインリーダーとしての役割を担い、オプションで第2リーダーを持つことができます。

この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を1つのリーダーにマッピングしようとしていますか?あなたは単純な言葉で何をしようとしていますか? –

+0

@mujibishola JPAアノテーションとのこの二重の関連付けをコーディングしたいと思います。それだけです。 – julian

+0

これは二重関連ではありません。 「人」は、「チーム」について知る必要があります。 「メイン」と「セカンド」の「チーム」との関連性は示されていません。 – ChiefTwoPencils

答えて

3

アソシエーション名は、使用する役割を示唆しています。 Main LeaderはロールmainLeaderに対応している可能性があります。だから私はちょうどTeamのプロパティを作成します。

しかし、関連付けはちょうど名前が付けられ、役割を持たないので、あなたは希望で役割を作成するために開いています。これは文脈から導かれるべきです。

0

2つの1対1双方向関連のJPAアノテーション付き相互参照プロパティを使用するエンティティクラスコードは、かなり良好に見えます。あなたのクラス図は、対応する関連付けの終わりに参照プロパティの名前(mainLeaderなど)を使用せず、アソシエートの終了所有者のドットを使用していないため、非常に良く見えません。アソシエーションの終了は、相手側のクラスの対応するプロパティとして実装されます。

オープンアクセスブックJava、JPA、JSFを使用したバックエンドWebアプリケーションChapter 15に、双方向の関連付けに関する次の例があります。Publisherクラスにおいて

Two bidirectional associations

、我々は、publishedBooksプロパティを追加して、我々は、逆の関係を表す、Bookクラスから@ManyToOneに対応@OneToManyアノテーションを使用:の

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

mappedByパラメータ@OneToManyPublisher :: publishedBooksプロパティの注釈は、リレーションを実装するプロパティをに指定しますクラス:私たちは逆の関係を表すBookクラスから@ManyToManyに対応@ManyToManyアノテーションでauthoredBooksプロパティを追加Authorクラスで

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

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

ため@ManyToMany注釈のmappedByプロパティAuthor :: authoredBooksは、クラスで@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; 
    ... 
} 

我々はまた、例えば、表がbooks_authorsあると列がBOOK_ISBNAUTHOR_PERSONID命名されている(MNY対多の関係と結合テーブルのための対応する列名の参加のテーブル名を指定する@JoinTableアノテーションを使用)。

-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)2つの異なる参照プロパティ(mainLeaderとSecondLeader)を同じ逆プロパティにリンクすることはできません。 (2) 'Person' ::' team'プロパティはチームメンバーシップ協会を表し、 'Team' ::' mainLeader'(および 'secondLeader')プロパティはリーダーシップ関連を表します。 –

+0

@gwagそれが正しいかどうかわかりませんでした。私は、umlダイアグラムに適合する解決策を試して待っています。 – julian

+0

あなたの質問にあなたが提供するコードは、あなたのクラス図に合っています。クラスダイアグラムが正しい方法で行われている場合(「チーム」側でオプションの関連付けの終わりではなく強制的なものを持つように)、いくつかの質問だけがあります。 –