当前位置 > it书童 > java > 正文

SpringDataJPA 中的多对多关系

java it书童 2020-11-20 15:06:28 0赞 0踩 36阅读 0评论

多对多关系最常用的表关系是:用户与角色关系。一个用户可以有多个角色,一个角色可以有多个用户

创建实体类

User 实体类

@Entity
@Table(name = "sys_user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="user_id")
    private Long userId;
    @Column(name="user_name")
    private String userName;
    @Column(name="age")
    private Integer age;

    @ManyToMany(targetEntity = Role.class,cascade = CascadeType.ALL)
    @JoinTable(name = "sys_user_role",
        //joinColumns,当前对象在中间表中的外键
        joinColumns = {@JoinColumn(name = "sys_user_id",referencedColumnName = "user_id")},
        //inverseJoinColumns,对方对象在中间表的外键
        inverseJoinColumns = {@JoinColumn(name = "sys_role_id",referencedColumnName = "role_id")}
    )
    private Set<Role> roles = new HashSet<>();

    // ...

}

Role 实体类

@Entity
@Table(name = "sys_role")
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "role_id")
    private Long roleId;
    @Column(name = "role_name")
    private String roleName;

    //配置多对多
    @ManyToMany(mappedBy = "roles")  //配置多表关系
    private Set<User> users = new HashSet<>();
    
    // ...

}

在多对多(保存)中,如果双向都设置关系,意味着双方都维护中间表,都会往中间表插入数据,中间表的2个字段又作为联合主键,所以报错,主键重复,解决保存失败的问题:只需要在任意一方放弃对中间表的维护权即可,推荐在被动的一方放弃

注解说明

@ManyToMany 作用:用于映射多对多关系 属性:

  • cascade:配置级联操作。

  • fetch:配置是否采用延迟加载。

  • targetEntity:配置目标的实体类。映射多对多的时候不用写。

@JoinTable 作用:针对中间表的配置 属性:

  • nam:配置中间表的名称

  • joinColumns:中间表的外键字段关联当前实体类所对应表的主键字段

  • inverseJoinColumn:中间表的外键字段关联对方表的主键字段

@JoinColumn 作用:用于定义主键字段和外键字段的对应关系。属性:

  • name:指定外键字段的名称

  • referencedColumnName:指定引用主表的主键字段名称

  • unique:是否唯一。默认值不唯一

  • nullable:是否允许为空。默认值允许。

  • insertable:是否允许插入。默认值允许。

  • updatable:是否允许更新。默认值允许。

  • columnDefinition:列的定义信息。

添加数据

@Test
@Transactional
@Rollback(false)
public void testAdd() {
    User user = new User();
    user.setUserName("xiaoli");

    Role role = new Role();
    role.setRoleName("javaer");

    user.getRoles().add(role);
    role.getUsers().add(user);

    userDao.save(user);
    roleDao.save(role);
}

源码 javaDemo 3342a31

关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
转载须注明出处:https://www.itshutong.com/articles/835