web-dev-qa-db-ja.com

JPAアノテーションで結合テーブルを作成する方法は?

JPA注釈を使用してデータベースに結合テーブルを作成する必要があるため、結果は次のようになります。

enter image description here

これまでのところ、2つのエンティティを実装しました。

@Entity
@Table(name="USERS", schema="ADMIN")
public class User implements Serializable {

    private static final long serialVersionUID = -1244856316278032177L;
    @Id 
    @Column(nullable = false)
    private String userid;  

    @Column(nullable = false)
    private String password;

    public String getUserid() {
        return userid;
    }

    public void setUserid(String userid) {
        this.userid = userid;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}

@Entity
@Table(name="GROUPS", schema="ADMIN")
public class Group implements Serializable {

    private static final long serialVersionUID = -7274308564659753174L;
    @Id
    @Column(nullable = false)
    private String groupid;

    public String getGroupid() {
        return groupid;
    }
    public void setGroupid(String groupid) {
        this.groupid = groupid;
    }
}

USER_GROUPと呼ばれる別のエンティティを作成する必要がありますか、またはいくつかの注釈を追加するだけでよいので、エンティティ(ORM)からテーブルを作成するときに結合テーブルが自動的に作成されますか?

画像と同じようにエンティティに注釈を付けるにはどうすればよいですか?

29
sfrj

User_Groupエンティティは、オブジェクト指向のものよりも基礎となるデータベース表現であるため、作成しないでください。

次のようなものを定義することで、結合テーブルを実現できます。

@Entity
@Table(name="USERS", schema="ADMIN")
public class User implements Serializable {
//...

@ManyToOne
@JoinTable(name="USER_GROUP")
Group group;

@Entity
@Table(name="GROUPS", schema="ADMIN")
public class Group implements Serializable {
//...

@OneToMany(mappedBy="group")
Set<User> users;

編集:列の名前を明示的に設定する場合、以下に示すように@JoinColumn要素を使用できます。

@ManyToOne
@JoinTable(name="USER_GROUP",
    joinColumns = @JoinColumn(name = "userid", 
                              referencedColumnName = "userid"), 
    inverseJoinColumns = @JoinColumn(name = "groupid", 
                              referencedColumnName = "groupid"))
Group group;
38
Piotr Nowicki

この方法で実装します。

@Entity
@Table(name="GROUPS", schema="ADMIN")
public class Group implements Serializable {
  @OneToMany
  @JoinTable(name = "USER_GROUP",
            joinColumns = @JoinColumn(name = "groupid"),
            inverseJoinColumns = @JoinColumn(name = "userid"))
  private List<User> users;
}

@PedroKowalskiによって提案されたソリューションも機能するはずですが、Groupエンティティへの参照をserエンティティに保持する必要がありますが、これは常に可能ではありません。

6
jFrenetic

ダイアグラムと同じアノテーションを使用するには、Userクラスでこれを実行できます。

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "USER_GROUP", 
           joinColumns = { @JoinColumn(name = "userid") }, 
           inverseJoinColumns = { @JoinColumn(name = "groupid") })
private List<Group> grups;

グループクラスで

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "USER_GROUP", 
           joinColumns = { @JoinColumn(name = "groupid") }, 
           inverseJoinColumns = { @JoinColumn(name = "userid") })
private List<User> users;
6
user902383

クエリに直接アクセスできないことを考慮して、この方法で結合テーブルを作成するポイントは何ですか? JPAは結合テーブルに直接クエリを作成することを許可していないため、ユーザーがSER_GROUPで操作を行う場合は、sersの間に通常の結合クエリを作成する必要があります。およびグループ;このため、結合テーブルUSER_GROUPは役に立ちません。

0
Angel