JPA级联查询----多对多

 

用户实体

@Setter
@Getter
@Entity
@Table(name = "sys_user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_id")
    private Long roleId;
    @Column(name = "user_name")
    private String roleName;

    @Column(name = "age")
    private String age;

    /**
     * 配置角色到用户的多对多关系
     */
    @ManyToMany(targetEntity = Role.class)
    @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>();
}

角色实体

@Setter
@Getter
@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;
    /**
     * 配置角色到用户的多对多关系
     * 配置多对多映射关系
     * 1.声明表关系配置
     * @ManyToMany(targetEntity = User.class)
     * targetEntity 对方实体类字节码
     * 2.配置中间表(包含两个外键)
     *
     *
      */
    @ManyToMany(targetEntity = User.class)
    @JoinTable(name = "sys_user_role",
            //name 中间表名称
            //joinColumns 数组 当前对象在中间表中的外键
            joinColumns ={@JoinColumn(name = "sys_role_id",referencedColumnName = "role_id")},
            //inverseJoinColumns 数组  对方对象在中间表中的外键
            inverseJoinColumns = {@JoinColumn(name = "sys_user_id",referencedColumnName = "user_id")})
    private Set<User> users = new HashSet<User>();

    /*@ManyToMany(mappedBy = "roles")
    private Set<User> users = new HashSet<User>();*/
}

测试

@Test
     @Transactional
     @Rollback(false)
     public void ManyToManyAdd(){
         User user=new User();
         user.setRoleName("张三");

         Role role=new Role();
         role.setRoleName("java程序员");
         /*//配置用户到角色关系,可以对中间表中的数据进行维护
         user.getRoles().add(role);
        //配置角色到用户关系,可以对中间表中的数据进行维护
         role.getUsers().add(user);*/
         userDao.save(user);
         roleDao.save(role);

     }

控制台

 

 从这里可以看到 只有两条insert语句 ,但中间表是没有数据的

修改测试

  @Test
     @Transactional
     @Rollback(false)
     public void ManyToManyAdd(){
         User user=new User();
         user.setRoleName("张三");

         Role role=new Role();
         role.setRoleName("java程序员");
         //配置用户到角色关系,可以对中间表中的数据进行维护
         user.getRoles().add(role);
       /* //配置角色到用户关系,可以对中间表中的数据进行维护
         role.getUsers().add(user);*/
         userDao.save(user);
         roleDao.save(role);

     }

配置了关联关系, 中间表就有数据了

问题 : 可以从用户到角色 也可以 角色到用户 如果同时执行???

报错 中间表中已经有主键

 @Test
     @Transactional
     @Rollback(false)
     public void ManyToManyAdd(){
         User user=new User();
         user.setRoleName("张三");

         Role role=new Role();
         role.setRoleName("java程序员");
         //配置用户到角色关系,可以对中间表中的数据进行维护
         user.getRoles().add(role);
        //配置角色到用户关系,可以对中间表中的数据进行维护
         role.getUsers().add(user);
         userDao.save(user);
         roleDao.save(role);

     }

 

 

 这就又到了某一方放弃维护权了 ,一般被动的一方放弃(就是谁先执行或者谁在执行)

 

 

 级联 

 

 

 @Test
    @Transactional
    @Rollback(false)
    public void CascadeManyToManyAdd(){
        User user=new User();
        user.setRoleName("张三");

        Role role=new Role();
        role.setRoleName("java程序员");
        //配置用户到角色关系,可以对中间表中的数据进行维护
        user.getRoles().add(role);
        //配置角色到用户关系,可以对中间表中的数据进行维护
        role.getUsers().add(user);
        userDao.save(user);
        //roleDao.save(role);

    }

此处注销了  roleDao.save(role);

 

级联删除

 

 

@Test
    @Transactional
    @Rollback(false)
    public void CascadeManyToManyReomve(){

        User user=userDao.findOne((long) 1);
        userDao.delete(user);


    }

 

posted @ 2020-11-24 22:12  SoToHard  阅读(493)  评论(1编辑  收藏  举报