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