问题描述
是这样,挺普通的设计,t_role(角色)表与t_menu(可访问资源)表的多对多映射。关联表为t_role_menu 目前别的问题都没,就是我发现每次更新一下某个menu的属性,例如名称啦,关联表里就会将所有该menu记录关联对应的记录删除,搞的我每次都要去把该更改过的menu重新加给role,有时会有多个role有可访问该menu的权限,那我就要挨个给这些role把该条menu给加进去,肯定不行。 断断续续弄了一段时间,没搞定。请各位支个招,上代码! Role: public class Role{private Integer id;private String rolename; // 角色名称//省略部分.......private Set<Menu> menus; // 角色可访问菜单/** * @return the id */public Integer getId(){return id;}/** * @param id * the id to set */public void setId(Integer id){this.id = id;}/** * @return the rolename */public String getRolename(){return rolename;}/** * @param rolename * the rolename to set */public void setRolename(String rolename){this.rolename = rolename;}/** * @return the menus */public Set<Menu> getMenus(){return menus;}/** * @param menus * the menus to set */public void setMenus(Set<Menu> menus){this.menus = menus;} Menu: private Integer id;private String menuname;// 菜单名称private Menu parentMenu;// 上一级菜单private Set<Menu> childMenus;// 下一级菜单//省略部分内容.....private Set<Role> role;// 菜单所属角色/** * @return the childMenus */public Set<Menu> getChildMenus(){return childMenus;}/** * @param childMenus * the childMenus to set */public void setChildMenus(Set<Menu> childMenus){this.childMenus = childMenus;}/** * @return the menuname */public String getMenuname(){return menuname;}/** * @param menuname * the menuname to set */public void setMenuname(String menuname){this.menuname = menuname;}/** * @return the role */public Set<Role> getRole(){return role;}/** * @param role * the role to set */public void setRole(Set<Role> role){this.role = role;}/** * @return the parentMenu */public Menu getParentMenu(){return parentMenu;}/** * @param parentMenu * the parentMenu to set */public void setParentMenu(Menu parentMenu){this.parentMenu = parentMenu;} 映射文件 Role.hbm.xml: <id name="id" type="integer"> <column name="id"/> <generator class="increment"></generator> </id> <!-- 省略部分..... --> <!-- 角色菜单多对多 --> <set name="menus" table="t_role_menu" cascade="delete"> <key column="role_id"/> <many-to-many class="com.cb.recruitment.model.Menu" column="menu_id"/> </set> Menu.hbm.xml: <id name="id" type="integer"> <column name="id"/> <generator class="increment"/> </id> <!-- 省略部分....--> <!-- 上级菜单--> <many-to-one name="parentMenu" class="com.cb.recruitment.model.Menu" insert="true"> <column name="parent_id" /> </many-to-one> <!-- 下级菜单 --> <set name="childMenus" > <key column="parent_id"/> <one-to-many class="com.cb.recruitment.model.Menu"/> </set> <!-- 菜单角色多对多 --> <set name="role" table="t_role_menu" inverse="true" cascade="delete"> <key column="menu_id"/> <many-to-many class="com.cb.recruitment.model.Role" column="role_id"/> </set>
解决方案
把XML 里的级联关系去掉呢??
解决方案二:
请配置关联的Cascade为删除游离状态。
解决方案三:
为毛是这样子的,,,不应该是三张表的么。。。不应该是三个类和三个配置的么。。。。数据库表不应该是差不多这样的么t_role表 role_id, role_namet_menu表 menu_id, menu_namet_role_menu表 role_menu_id, menu_id, role_id你的java类里不应该这样啊。。。role里有menu的set,menu里有role的set。。
解决方案四:
配置单项多对多呢.?把t_menu这边的映射去掉.