Skip to content
On this page

多对多

在数据表中,多对多关系时通过一张中间表的方式确立的,而在面向对象的类与类中是通过每一方拥有对方属性集合方式的双向关联确定的

比如:角色和权限,就需要一张中间表来维护它们多对多的关系

使用@ManyToMany注解标记多对多关系,其中某一方配置@JoinTable属性来指定关系表的名称,JoinColums属性指定实体在指定关系表中各列的名称即是否配置外键等约束,inverseJoinColumns属性指定对方实体,uniqueConstraints属性指定联合主键

新增角色实体类

java
package com.huangjiliang.jpa.entity;

import lombok.Data;
import lombok.experimental.Accessors;

import javax.persistence.*;
import java.util.List;

@Entity
@Table(name = "sys_roole")
@Data
@Accessors(chain = true)
public class SysRole {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column
    private String roleName;

    @Column
    private String roleCode;

    @ManyToMany
    @JoinTable(name = "h_role_permission",
            joinColumns = @JoinColumn(name = "role_id", foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT)),
            inverseJoinColumns = @JoinColumn(name = "permission_id", foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT)),
            uniqueConstraints = @UniqueConstraint(columnNames = {"role_id", "permission_id"})
    )
    private List<SysPermission> permissions;

}

新增权限实体类

java
package com.huangjiliang.jpa.entity;


import lombok.Data;
import lombok.experimental.Accessors;

import javax.persistence.*;
import java.util.List;

@Entity
@Table(name = "sys_permission")
@Data
@Accessors(chain = true)
public class SysPermission {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column
    private String name;

    @Column
    private String code;

    /**
     * 将维护权限交给SysRole
     */
    @ManyToMany(mappedBy = "permissions")
    prsivate List<SysRole> roles;
}

添加实体类后,运行项目,会自动生成sys_role、sys_permission以及中间表h_role_permission

在多对多关系中,因为都是多的一方有另一方泛型的List,所以在进行增删改查时,契合一对多是一致的