Jpa 指定中间表实现级联查询

587 阅读1分钟

场景

以用户、角色、权限的经典方式演绎一下如何使用

一个用户可以拥有多个角色; 一个角色可以被多人同时拥有; 一个角色可以拥有多个权限;

此处只谈用户和角色,暂时不说权限;

需求

在查询用户时同时查询出用户拥有的角色

数据库表

用户表:sys_user

中间表:sys_user_role

角色表:sys_role

关联方式:

sys_user.uid ====> sys_user_role.uid

sys_role.role_name =====> sys_user_role.role_name

实现方式

基类

@Getter
@Setter
@MappedSuperclass()
public  abstract class AbstractEntity implements Serializable,Cloneable {


    @Id
    private Integer id;

    @Transient
    private LocalDate createTime;

    @Transient
    private LocalDate updateTime;

角色类


@Getter
@Setter
@Entity
@EqualsAndHashCode(callSuper = true)
@Table(name = "sys_role")
public class SysRole extends AbstractEntity {


    @Column(name = "role_name")
    private String roleName;

    @Column(name = "role_desc")
    private String roleDesc;

}

用户类

定义set集合接受级联查询出的角色

1.使用@ManyToMany

2.@JoinTable(name=“指定中间表表名”,joinColumns={ @JoinColumn(name="当前表的外键对应的中间表的列的列名"),referencedColumnName=“当前表的外键列名”},

inverseJoinColumns={ @JoinColumn(name = "另一张表的外键对应的中间表的列的列名", referencedColumnName = "中间表关联的另一张表的外键列名",table = "中间表关联的另一张表表名")

})

@Getter
@Setter

@Entity
@Table(name = "sys_user")
@EqualsAndHashCode(callSuper = true)
public class SysUser extends AbstractEntity {

    @Column(name = "uid")
    private String userId;
    @Column(name = "pwd")
    private String pwd;

    @ManyToMany
    @JoinTable(name = "sys_user_role", joinColumns = {
            @JoinColumn(name = "uid", referencedColumnName = "uid",table = "sys_user"),
    }
            , inverseJoinColumns = {
            @JoinColumn(name = "role_name", referencedColumnName = "role_name",table = "sys_role")
    })
    private Set<SysRole> roleSet = new HashSet<>();


}

用户角色中间表对应类

@Table(name = "sys_user_role")
@Getter
@Setter
@Entity
@EqualsAndHashCode
public class SysUserRole extends AbstractEntity {

    @Column(name = "uid")
    private String uid;
    @Column(name = "role_name")
    private String roleName;

}