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

问题描述:

是这样,挺普通的设计,t_role(角色)表与t_menu(可访问资源)表的多对多映射。关联表为t_role_menu
目前别的问题都没,就是我发现每次更新一下某个menu的属性,例如名称啦,关联表里就会将所有该menu记录关联对应的记录删除,搞的我每次都要去把该更改过的menu重新加给role,有时会有多个role有可访问该menu的权限,那我就要挨个给这些role把该条menu给加进去,肯定不行。
断断续续弄了一段时间,没搞定。请各位支个招,上代码!

Role:
[code="java"]
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;
}

[/code]

Menu:
[code="java"]
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;
}

[/code]

映射文件
Role.hbm.xml:

[code="xml"]



 <!-- 省略部分..... -->


<!-- 角色菜单多对多 -->
<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>

[/code]

Menu.hbm.xml:
[code="xml"]




<!-- 省略部分....-->

<!-- 上级菜单-->


<!-- 下级菜单 -->
<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>

[/code]

把XML 里的级联关系去掉呢??

配置单项多对多呢.?

把t_menu这边的映射去掉.

为毛是这样子的,,,
不应该是三张表的么。。。不应该是三个类和三个配置的么。。。。

数据库表不应该是差不多这样的么

t_role表 role_id, role_name

t_menu表 menu_id, menu_name

t_role_menu表 role_menu_id, menu_id, role_id

你的java类里不应该这样啊。。。role里有menu的set,menu里有role的set。。

请配置关联的Cascade为删除游离状态。