Hibernate 双向多对多关联的问题,更新一主表字段,关联表就会删除该记录在关联表中的对应

问题描述

是这样,挺普通的设计,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这边的映射去掉.

时间: 2024-09-27 07:51:30

Hibernate 双向多对多关联的问题,更新一主表字段,关联表就会删除该记录在关联表中的对应的相关文章

hibernate双向多对多注解实现的方式不能正确删除数据?

问题描述 hibernate双向多对多注解实现的方式不能正确删除数据? 注解方式实现多对多的查询,添加正常,删除可不行啊....双向多对多注解

【SSH系列】Hibernate映射 -- 多对多关联映射

     映射原理         在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张表中做一个关联,用第三张表来解决可能造成的数据冗余问题.今天这篇博文小编来简单的介绍一下hibernate中的多对多关联映射.        在某些系统中,一个用户可以有多个角色,一个角色也可以有多个用户,so,她们之

关于hibernate的多对多,有看法,请大家来看看解决下我的疑问。

问题描述 是这样的,鄙人对hibernate用的不是很多关于hibernate多对多的时候我们平时都是用set集合来但是为什么不为hibernate像数据库那样,建立一个中间bean,来关联两边呢?像下图这样我的merchantInfo和MenuInfo是多对多的关系写hql语句就这样写:String hql = "from MenuInfo mi where mi.menuId in(select menuId from MerchantMenuInfo mmi where mmi.merch

Silverlight:双向绑定综合应用-自动更新集合汇总字段

场景:有一家公司(类名:Company),它有N多员工(类名:Employee).要在界面上用网格显示所有员工的姓名.工资,并且当操作用户在网格里对员工进行增减或修改其工资时,能自动汇总出员工工资的总和并显示出来. 员工类 Employee代码如下: /// <summary> /// 员工类 /// </summary> public class Employee:INotifyPropertyChanged { private string _name = "&quo

hibernate的多对一,一对多,多对多,一对一怎么理解?

问题描述 hibernate的多对一,一对多,多对多,一对一怎么理解? 是多个字段对应一个字段,一个字段对应多个字段,多个字段对应多个字段?还是多个对象对应一个对象,一个对象对应多个对象,多个对象对应多个对象. 在一对一的表中为什么是有外键的要设计成many-to-one?无外键的设计成non-to-one? 解决方案 就是字面意思,一个key可以对应另一张表的多个字段,就好像身份对应城市一样

hibernate注解多对多级联保存怎么解

问题描述 hibernate注解多对多级联保存怎么解 @ManyToMany(mappedBy=""sysUsers""cascade={CascadeType.PERSISTCascadeType.MERGE}) private Set<SysDept> sysDept = new HashSet<SysDept>(0); //部门 @ManyToMany( cascade={CascadeType.PERSISTCascadeType.M

框架-JAVA问题:hibernate测试多对一的save时,报异常

问题描述 JAVA问题:hibernate测试多对一的save时,报异常 然后测试就红条报了个异常,提示id是非法属性?o(╯□╰)o 解决方案 类定义时,你的id属性定义的为Long类型,所以对应的配置文件属性映射也应该指定数据库类型为long才行. 试试修改配置文件中的id属性,如下: <id name="id" column="id" type="long"> <generator class="native&q

hibernate取出数据并修改后不更新到数据库

问题描述 hibernate取出数据并修改后不更新到数据库 2C 有文章表article hbm:和文章对应的题目表item hbm: 他们为一对多关系,现在在数据库中一篇article对应有18个item,问:怎么样从一片文章中随机抽取6个item再将这个article放到struts2的堆中时,数据库中的每篇文章依然对应18个item;怎么每次我取出来后,数据库中的文章只对应6个item??? 解决方案 数据库修改后Hibernate的配置更新数据库修改后Hibernate的配置更新 解决方

oracle利用merge更新一表的某列数据到另一表中

假设你有两张表 t1 表 -------------------------- id |    name   |   pwd 1  |      n1     |    t2 表 --------------------------- id    |     pwd  1   |      p1   那么你想根据t2.pwd把"p1"这个值给放到t1中的t1.pwd里面去. merge into t1 aa -- 往t1中添加数据 using t2 bb --参照t2表 on (aa.