jpa構成多対多関係(中間テーブル)
8649 ワード
2つのエンティティtb_user,tb_role今からtb_userまたはtb_roleのいずれかの内部で関係を維持し、複数対の場合、この関係のマッピングを完了するために中間テーブルを作成する必要があります.tb_userに注記@ManyToManyを追加し、注記@JoinTableを追加します.中間テーブルを作成するため、この注記を使用します.JoinTable注記では、joinColumnsの現在のテーブルのフィールドが中間テーブルのフィールド名、inverseJoinColumnsに関連付けられた外部キーテーブルが中間テーブルのフィールド名の例を追加します.
なぜならtb_userでは2つのテーブルの関係を維持しているので、tb_roleで関連フィールドを作成したくない場合はtbUserの関係フィールドを追加する必要はありません
tb_でroleで関連フィールドを維持するには、次のようにします.フィールドに注記@ManyToManyを追加し、直接プロパティmappedBy値を使用します.現在のテーブルの関連テーブルのフィールド名です.
@Entity
@Table(name = "tb_user")
@SequenceGenerator(name = "tb_user_sq",sequenceName = "tb_user_sqe")
public class TbUser extends BaseEntity{
/**
*
*/
private String userName;
/**
*
*/
private String loginName;
/**
*
*/
private String passWord;
/**
*
*/
private String telPhone;
/**
*
*/
private List tbRoleList=new ArrayList<>();
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String getTelPhone() {
return telPhone;
}
public void setTelPhone(String telPhone) {
this.telPhone = telPhone;
}
@Id
@Override
@GeneratedValue(generator = "tb_user_sq",strategy = GenerationType.SEQUENCE)
public Long getId() {
return this.id;
}
@ManyToMany(cascade = CascadeType.REMOVE,fetch = FetchType.LAZY)
@JoinTable(name = "tb_user_role",joinColumns = @JoinColumn(name="tb_user_id",referencedColumnName = "id"),inverseJoinColumns = @JoinColumn(name = "tb_role_id",referencedColumnName = "id"))
public List getTbRoleList() {
return tbRoleList;
}
public void setTbRoleList(List tbRoleList) {
this.tbRoleList = tbRoleList;
}
}
なぜならtb_userでは2つのテーブルの関係を維持しているので、tb_roleで関連フィールドを作成したくない場合はtbUserの関係フィールドを追加する必要はありません
@Entity
@Table(name = "tb_role")
@SequenceGenerator(name = "tb_role_sq",sequenceName = "tb_role_sqe")
public class TbRole extends BaseEntity{
@Override
@Id
@GeneratedValue(generator = "tb_role_sq",strategy = GenerationType.SEQUENCE)
public Long getId() {
return this.id;
}
private String roleName;
@ManyToMany(mappedBy = "tbRoleList")
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
}
tb_でroleで関連フィールドを維持するには、次のようにします.フィールドに注記@ManyToManyを追加し、直接プロパティmappedBy値を使用します.現在のテーブルの関連テーブルのフィールド名です.
@Entity
@Table(name = "tb_role")
@SequenceGenerator(name = "tb_role_sq",sequenceName = "tb_role_sqe")
public class TbRole extends BaseEntity{
@Override
@Id
@GeneratedValue(generator = "tb_role_sq",strategy = GenerationType.SEQUENCE)
public Long getId() {
return this.id;
}
private String roleName;
private List tbUserList=new ArrayList<>();
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
@ManyToMany(mappedBy = "tbRoleList")
public List getTbUserList() {
return tbUserList;
}
public void setTbUserList(List tbUserList) {
this.tbUserList = tbUserList;
}
}