jpa構成多対多関係(中間テーブル)

8649 ワード

2つのエンティティtb_user,tb_role今からtb_userまたはtb_roleのいずれかの内部で関係を維持し、複数対の場合、この関係のマッピングを完了するために中間テーブルを作成する必要があります.tb_userに注記@ManyToManyを追加し、注記@JoinTableを追加します.中間テーブルを作成するため、この注記を使用します.JoinTable注記では、joinColumnsの現在のテーブルのフィールドが中間テーブルのフィールド名、inverseJoinColumnsに関連付けられた外部キーテーブルが中間テーブルのフィールド名の例を追加します.

@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;
    }
}