2017-06-26 7 views
0

プロジェクトが複数のタスクを持つことができるプロジェクトやタスクのような一対多の関連付けを考えてみましょう。これがプロジェクト表の主キーを参照するタスク表の外部キー句を使用してモデル化されている場合、@ JoinColumn注釈を所有サイド、つまり多くの側が常に所有側であるタスク表に入れます。 しかし、これが第3のテーブルproject_taskを使用してマッピングされている場合、@JoinTable注釈は反対側で、つまりプロジェクトエンティティで使用されています。しかし、@ JoinTableは常に所有側にあるべきです。外部キーを持つなぜ@JoinTable注釈は常に@OneToMany注釈とともに表示されます

アプローチ1:3番目のテーブルと@JoinTableアノテーションで

@Entity 
public class Project { 

    @OneToMany(mappedBy = "project") 
    private Collection<Task> tasks; 

} 

@Entity 
public class Task { 

    @ManyToOne 
    @JoinColumn(name="PROJECT_ID") 
    private Project project; 

} 

アプローチ2:@JoinTableを使用した場合

@Entity 
public class Project { 

    @JoinTable(name = "MY_JT", 
    joinColumns = @JoinColumn(
      name = "PROJECT_ID", 
    ), 
    inverseJoinColumns = @JoinColumn(
      name = "TASK_ID" 
    ) 
    @OneToMany 
    private List<Task> tasks; 

} 
@Entity 
    public class Task { 

     private Project project; 

} 

なぜ所有側は、プロジェクトエンティティにシフトしていますか?

答えて

0

アソシエーションのもう一方の端を知っているエンティティとして所有側を理解してください。

私は関連するエンティティに到達することができだので、私は私が関連するエンティティに到達できるようにする情報を持っている場合、私は所有するエンティティています。

最もよく使用されるケースは、外部キーを関連の多くの側に置くことです。 プロジェクトとタスクの関係がある場合は、1つのプロジェクトに多くのタスクを持たせることができます。 project_id列は、CarからProject Entityに到達するための情報(Project Fk)を保持しているため、関係の所有側になるTaskテーブルに追加されます。

あなたはもう双方向関連のように関連したUserエンティティに到達するための情報を持っていない単方向関連ので、車の実体を設計しているOneToMany協会に@JoinTableを使用しています。 この情報は、ユーザーエンティティにある結合表によって保持されるようになり、ユーザーエンティティは関係の所有側になります。

質問に答えるために、所有側はProjetに移行しました。プロジェクトからタスクにアクセスできなくなったため、プロジェクトに関連付けられたタスクをProjectエンティティが保持する結合テーブルを使用する唯一の方法です。それでは、プロジェクトに関連付けられたタスクを取得するための情報を保持するjoinTableを通じてプロジェクトエンティティです。 希望です。

0

「シフト」とはどういう意味ですか?関連の所有サイドはそのアソシエーションの側か、アソシエーション注釈にmappedByパラメータがない側です。

2番目の例では、アソシエーションが一方向です(Taskにそのアソシエーションのマッピングがないため)Projectが所有側です。

アソシエーションの所有側は、アソシエーションを管理する側(つまり、その側への変更が記録される)です。Taskは、このように定義されていた:

@Entity 
public class Task { 
    @ManyToOne(mappedBy="tasks") 
    private Project project; 
} 

Projectはまだ所有側になります(意味:Task.projectへの変更は無視されるだろうが、Project.tasksへの変更が記録されるだろうが)。これは珍しいが有効なマッピングです(通常、双方向の一対多の関連で多くの側を所有側と宣言するのがより理にかなっていますが、逆のことも可能です)。

関連する問題