用户和角色表的多对多的关系
用户表加了lombok@Data的注解不报异常
能正常的操作,但是角色表就加不了@Data的注解
1.会报内存溢出
2.角色表用setter 和getter 方法和to String 方法
toString 方法一定不能重写 用户对象
不然也是报内存溢出
当然了角色表中用lombok的
@Setter
@Getter
注解来代替手动的getter和setter也是可以的
=====================================
作者和文章的一对多的关系
文章表加lombok@Data的注解不报异常,能正常的操作,但是作者表就加不了@Data的注解会报内存溢出,如果手动重写to String 方法的话也是不能
不能重写 文章对象不然也会报内存溢出,用
当然了作者表中用lombok的
@Setter
@Getter
注解来代替手动的getter和setter也是可以的
总结来看:
无论时多对多还是一对多,都得看谁是维护的一方,或者说是主动的一方,操作的一方,在这一方,加
lombok@Data注解没有问题,但是另外一方就有问题,如果手动生成的话也不能重写对方的对象
猜想问题是出现在toString方法上
但具体怎么回事不清楚,在这里记录以便以后查看
注:下面的用户表和角色表多对多的关系就没有报异常
@Entity
@Table(name = "rbac_user")
@Data
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true,length = 16,nullable = false)
private String account;
@Column(nullable = false,length = 128)
@JsonIgnore
private String password;
@Column(name = "user_name",length = 32)
private String userName;
private String tel;
private Boolean enable = false;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "rbac_user_role",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id")
)
private Set<Role> roles;
}
@Entity
@Table(name = "rbac_role")
@Data
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false,length = 32,unique = true)
private String roleName;
@Column(nullable = false,length = 32,unique = true)
private String roleKey;
private Boolean enable = false;
private String description;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "rbac_role_permission",
joinColumns = @JoinColumn(name = "role_id"),
inverseJoinColumns = @JoinColumn(name = "permission_id")
)
@JsonIgnore
private Set<Permission> permissions;
}
使用的时候主表,维护端,操作方可以加lombok@Data注解,被维护端不要出现维护端的对象就可以加lombok@Data注解了
果然经过我的测试就是这样
看下面的列子:
@Entity
@Table(name="sys_user")
@Data
public class SysUser {
/**
* @author: leebob
* @date: 2020年4月24日 下午9:47:06
* 关系维护端,操作的一方,主动的一方
*/
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="user_id")
private Long userId;
@Column(name="user_code")
private String userCode;
@Column(name="user_name")
private String userName;
@Column(name="user_password")
private String userPassword;
@Column(name="user_state")
private String userState;
//多对多关系映射
@ManyToMany
@JoinTable(name="sys_user_role",
joinColumns={@JoinColumn(name="sys_user_id",referencedColumnName="user_id")},
inverseJoinColumns={@JoinColumn(name="sys_role_id",referencedColumnName="role_id")}
)
private Set<SysRole> roles ;
}
@Entity
@Data
@Table(name="sys_role")
public class SysRole {
/**
* @author: leebob
* @date: 2020年4月24日 下午9:48:04
* 关系被维护端,被动的一方
*/
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="role_id")
private Long roleId;
@Column(name="role_name")
private String roleName;
@Column(name="role_memo")
private String roleMemo;
}
测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class SysUserDemoTest {
/**
* @author: leebob
* @date: 2020年4月22日 下午12:18:05
*/
@Autowired
private SysUserDao userDao;
@Autowired
private SysRoleDao roleDao;
@Test
@Transactional
@Rollback(value = false)
public void saveSysRole() {
//创建对象
SysRole r1 = new SysRole();
r1.setRoleName("角色1");
SysRole r2 = new SysRole();
r2.setRoleName("角色2");
roleDao.save(r1);
roleDao.save(r2);
}
@Test
@Transactional
@Rollback(value = false)
public void saveUserRole2() {
Set<SysRole> rolelist=new HashSet<>();
SysUser u1 = new SysUser();
u1.setUserName("用户2");
//查询所以的角色
List<SysRole> roles = roleDao.findAll();
for (SysRole sysRole : roles) {
rolelist.add(sysRole);
}
//给用户设置角色
u1.setRoles(rolelist);
//保存用户并且保存用户的所以角色
userDao.save(u1);
}
@Test
@Transactional
@Rollback(value = false)
public void testfind() {
//这里查询所有也不会报内存溢出
List<SysUser> users = userDao.findAll();
users.forEach(System.out::println);
}
}
由此可见,被维护端可以不加维护端的对象集合,就可以加lombok@Data的注解了,简单省事
可能有人会想被维护端没有配置多对多关系,还会生成中间吗?
答案是肯定的
也就是说,多对多的关系配置,可以直接在维护端设置,而关系被维护端可以不需要设置,照样可以创建出三张表