私は3つのテーブルを持っています。私はそれらに加わりたいと思います。3つのテーブルを結合するHibernateとJPA
Tabels:タスク プロジェクト ユーザー
が、それらはすべて、それらの間の多対多関係を持っている:プロジェクトは、複数のユーザーおよびその逆を持っており、またタスクが複数のユーザーを持っているように逆もまた同様であり、プロジェクトおよびユーザにとっても同様である。 ** 1 **このように3つのエンティティへの参加:
プロジェクト:
私はJPA &休止状態でそれを実装する方法を見つけるためにしようとしていると私は2つの選択肢があり
@ManyToMany(fetch = FetchType.EAGER,
cascade =
{
CascadeType.DETACH,
CascadeType.MERGE,
CascadeType.REFRESH,
CascadeType.PERSIST
},
targetEntity = User.class)
@JoinTable(name = "Collaborators",
joinColumns = @JoinColumn(name = "ProjectFk", referencedColumnName = "id", updatable=false, nullable=false),
inverseJoinColumns = @JoinColumn(name = "UserFk", referencedColumnName = "id", updatable=false, nullable=false))
private Set<User> users = new HashSet<>();
ユーザー:
@ManyToMany(fetch = FetchType.EAGER,
cascade =
{
CascadeType.DETACH,
CascadeType.MERGE,
CascadeType.REFRESH,
CascadeType.PERSIST
},
targetEntity = Project.class)
@JoinTable(name = "Collaborators",
joinColumns = @JoinColumn(name = "UserFk", referencedColumnName = "id", updatable=false, nullable=false),
inverseJoinColumns = @JoinColumn(name = "ProjectFk", referencedColumnName = "id", updatable=false, nullable=false))
private Set<Project> projects = new HashSet<>();
タスク:
@ManyToMany(fetch = FetchType.EAGER,
cascade =
{
CascadeType.DETACH,
CascadeType.MERGE,
CascadeType.REFRESH,
CascadeType.PERSIST
},
targetEntity = User.class)
@JoinTable(name = "Collaborators",
joinColumns = @JoinColumn(name = "TaskFk", referencedColumnName = "id", updatable=false, nullable=false),
inverseJoinColumns = @JoinColumn(name = "ProjectFk", referencedColumnName = "id", updatable=false, nullable=false))
@MapKeyJoinColumn(name = "User_id")
@ElementCollection
private Map<Project, User> projectUserMap = new HashMap<>();
しかし、ここで、
を動作するようには思えdosn't:第四エンティティを作成し、コラボレーターそれに名前を付けた後、探してみてくださいこのSQLクエリを実装する方法:
select * from (
select user.id, Project.id, Task.id
inner join Project on user.join_key = Project.join_key
inner join Task on task.join_key = = Project.join_key
) collaborator
助けがあればMUCHがお勧めです。ありがとう。
私はちょうどあなたの設定を見て、多くのエラーと冗長性を見つけます。それについて深く理解するために、JPA Collection Mappingについてさらに研究してください。 –
これは、私がこれらの3つのテーブルをどのように結合するかについてはわかりませんからです。私はプロジェクトとユーザで最初は簡単に成功しましたが、3者関係では少し難しいです。 –
*私はmappedByを使用しません。なぜなら、削除操作のやり方を制御したいからです。*:これはあなたがやっている大きな誤りです。 mappedByと削除のcoltrollingは、eash otherとは関係ありません。双方向の関連付けでは、一方の側は逆の側でなければなりません**したがって、mappedByを使用してください。あなたは仕事で喧嘩をしてもあまり意味がありません。 3つのManyToMany関連がある場合、3つの異なる結合テーブルが必要です。 –