• 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);
    
    
        }

  • 相关阅读:
    Unity3D 学习笔记
    Python中os和sys模块
    合并两个排序的链表
    反转链表 难
    链表中倒数第k个结点
    调整数组顺序使奇数在偶数前 14
    javascript中this详解
    静态方法实例方法
    强制类型转换
    javascript类型判断方法
  • 原文地址:https://www.cnblogs.com/yangbom/p/14033080.html
Copyright © 2020-2023  润新知