关于这方面的文章很多,说的都很专业,有时候还真看不明白,或者看糊涂了;郑重声明:本人初学,有说的不当的大家多多包含,不过吐槽呢随便吐没事。
我喜欢代码说事,请看代码:
- //用户类中角色映射关系
- @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
- @JoinTable( name="loginuser_role", joinColumns = @JoinColumn(name = "userAccout"),
- inverseJoinColumns = @JoinColumn(name = "roleID"))
- private List<Role> role = new ArrayList<Role>();
- //角色类用户映射关系
- @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, mappedBy = "role")
- private List<LoginUser> loginUser = new ArrayList<LoginUser>();
代码详细说明略过,主要说明什么时候,中间表会存数据。代码解释如下:
- // 中间表插入了数据
- //用户service层
- UserService service = (UserService)ctx.getBean("userService");
- //用户
- LoginUser u = new LoginUser();
- u.setUserName("sdkjf");
- u.setUserPasswd("sdf");
- u.setUserAccout("d");
- //角色
- Role r = new Role();
- r.setRoleLeve(3);
- r.setRoleName("sdklf");
- List<Role> t = new ArrayList<Role>();
- t.add(r);
- //把角色加到用户
- u.setRole(t);
- service.add(u);//保存
- //中间表没有插入数据
- //角色service
- RoleService service = (RoleService) ctx.getBean("roleService");
- //角色
- Role r = new Role();
- r.setRoleLeve(3);
- r.setRoleName("sdklf");
- //用户
- LoginUser u = new LoginUser();
- u.setUserName("sdkjf");
- u.setUserPasswd("sdf");
- u.setUserAccout("d");
- List<LoginUser> lu = new ArrayList<LoginUser>();
- lu.add(u);
- //设置用户
- r.setLoginUser(lu);
- service.add(r);//保存
为何出现这样的情况,简单说明,因为在角色类中使用了mappedBy指向了用户对象中的role,这样的意思就是只能通过用户操作来做中间表(用户角色表)维护工作。如果不这样做,如上代码通过角色来做维护的时候,中间表是不会做任何数据修改工作的。
自己吐槽:1.为何hibernate做了这样的限制后,通过角色还能用户角色本表的插入工作,不提示任何错误,但是中间表就是没值(大神指教)
2.和第一问很相似,为何单单插入用户或者单单插入角色是可以的(就是我插入用户的时候我不设置角色,插入角色的时候我不设置用户。。。能成功,并且没有任何提示)。。。既然我设置了关系,应该每一个插入都是有校验的。。。不理解,大神指教
完事,第一次博文,如有用词不当格式不好欢迎吐槽。