首页 > 技术文章 > SpringData表关系:多对多

zhangrongfei 2019-08-22 16:51 原文

一、编写实体类配置关联关系:

1、多对多使用注解@ManyToMany配置:a、 在实体中添加一个集合属性  b、在属性上添加ManyToMany注解 

         c、@JoinTable 注解配置关联关系(name中间表名称),当前表和中间表的映射关系,对方表和中间表的映射关系

2、多对多关系中,只能一方维护关联关系、另一方放弃维护

3、级联操作: @ManyToMnay注解中   配置cascade属性

4、 从表:关联属性上所加注解

@ManyToMany(mappedBy = "roles")

主表:关联属性上所加注解

@ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "sys_user_role",joinColumns = @JoinColumn(
//            中间表和当前表映射字段的名字
            name="userid",
//            参照当前表的主键字段
            referencedColumnName = "user_id"),
            inverseJoinColumns =  @JoinColumn(
//            中间表和当前表映射字段的名字
                    name="roleid",
//            参照当前表的主键字段
                    referencedColumnName = "role_id")
    )

二、编写dao;主表从表dao都要继承JpaRepository

三、测试

package cn.zrf.jpa;

import cn.zrf.jpa.dao.SysRoleDao;
import cn.zrf.jpa.dao.SysUserDao;
import cn.zrf.jpa.entity.SysRole;
import cn.zrf.jpa.entity.SysUser;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Commit;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class ManyToMany {
    @Autowired
    SysUserDao sysUserDao;
    @Autowired
    SysRoleDao sysRoleDao;

    @Test
    @Transactional
    @Commit
    public void addUserAndRole(){
        //1、创建用户对象
        SysUser user = new SysUser();
        user.setUserName("admin");
        user.setPassword("admin");
        //2、创建角色对象
        SysRole role = new SysRole();
        role.setRoleName("管理员");
        role.setMome("管理全部");
        //3、配置用户和角色之间的关系
        user.getRoles().add(role);
        role.getUsers().add(user);
        //4、把用户角色存入数据库
        sysUserDao.save(user);
        sysRoleDao.save(role);
    }
    @Test
    @Transactional
    @Commit
    public void addUserAndRole1(){
        //1、创建用户
        SysUser sysUser = new SysUser();
        sysUser.setUserName("张无忌");
        sysUser.setPassword("admin");
        SysUser sysUser1 = new SysUser();
        sysUser1.setUserName("赵敏");
        sysUser1.setPassword("admin");
        //2、创建角色
        SysRole sysRole = new SysRole();
        sysRole.setRoleName("演员");
        SysRole sysRole1 = new SysRole();
        sysRole1.setRoleName("导演");
        //3、配置用户和角色的关系
        sysUser.getRoles().add(sysRole);
        sysUser1.getRoles().add(sysRole);
        sysUser.getRoles().add(sysRole1);
        sysUser1.getRoles().add(sysRole1);
        sysRole.getUsers().add(sysUser);
        sysRole1.getUsers().add(sysUser);
        sysRole.getUsers().add(sysUser1);
        sysRole1.getUsers().add(sysUser1);
        //4、存入数据库
        sysUserDao.save(sysUser);
        sysUserDao.save(sysUser1);
    }
    //删除
    @Test
    @Transactional
    @Commit
    public void del(){
        sysUserDao.delete(3l);
    }
}

  

推荐阅读