Hibernate (单向)多对多的更新问题

做SSH项目的时候碰到很多关于Hibernate关系映射更新的问题,有些问题在网上翻阅了很多资料也没找到根本的解决方法,所以记录下这些问题以作保存!

Hibernate (单向)多对多

业务环境如下:

一个系统有多个角色(role),一个角色对应多个模块(menu)和多个操作(action),role和menu,action之间单向的多对多关系,即可以从role查询到menu和action;

建立4个表:t_role表,t_menu表,r_role_menu表,r_role_action表

配置文件如下:

1、POJO类:

public class Role implements Serializable{
 private int id;
 private String roleName;
 private List<Menu> menus=new ArrayList<Menu>();
 private List<Action> actions=new ArrayList<Action>();
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getRoleName() {
  return roleName;
 }
 public void setRoleName(String roleName) {
  this.roleName = roleName;
 }
 public List<Menu> getMenus() {
  return menus;
 }
 public void setMenus(List<Menu> menus) {
  this.menus = menus;
 }
 public List<Action> getActions() {
  return actions;
 }
 public void setActions(List<Action> actions) {
  this.actions = actions;
 }
}

public class Menu implements Serializable{
 private int id;
 private String menuName;
 private String menuNum;
 private String url;
 private String desc;
 private Menu parent;
 private List<Menu> menus;
 private List actions=new ArrayList();
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getMenuName() {
  return menuName;
 }
 public void setMenuName(String menuName) {
  this.menuName = menuName;
 }
 public String getMenuNum() {
  return menuNum;
 }
 public void setMenuNum(String menuNum) {
  this.menuNum = menuNum;
 }
 public String getUrl() {
  return url;
 }
 public void setUrl(String url) {
  this.url = url;
 }
 public String getDesc() {
  return desc;
 }
 public void setDesc(String desc) {
  this.desc = desc;
 }
 public Menu getParent() {
  return parent;
 }
 public void setParent(Menu parent) {
  this.parent = parent;
 }
 public List<Menu> getMenus() {
  return menus;
 }
 public void setMenus(List<Menu> menus) {
  this.menus = menus;
 }
 public List getActions() {
  return actions;
 }
 public void setActions(List actions) {
  this.actions = actions;
 } 
}



《*******************************》

2、Hibernate配置文件:

《*******************************》

Role配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="bgi.teamwork.domain">
 <class name="Role" table="t_role">
  <id name="id" type="integer" column="role_id">
   <generator class="native" />
  </id>
  <property name="roleName" type="string" column="role_name" length="45" />
  <list name="menus" table="r_role_menu" inverse="false"  lazy="true" cascade="all">
   <key column="role_id"  />
   <list-index column="listindex"/><!-- by super:这里如果用了list就必须把这个写在ont to many前,否则报错  -->
   <many-to-many column="menu_id" class="Menu"  />
  </list>
  <list name="actions" table="r_role_action" inverse="false"  lazy="true" cascade="all">
   <key column="role_id"/>
   <list-index column="list_order"/>
   <many-to-many class="Action" column="action_id" />
  </list>
 </class>
</hibernate-mapping>

Menu配置文件:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="bgi.teamwork.domain">
 <class name="Menu" table="t_menu">
  <id name="id" type="integer" column="menu_id">
   <generator class="native" />
  </id>
  <property name="menuName" type="string" column="menu_name" length="45"/>
  <property name="menuNum" type="string" column="menu_num" length="45" />
  <property name="url" type="string" column="menu_url" length="200" />
  <property name="desc" type="text" column="menu_desc"/>
  <many-to-one name="parent" class="Menu" column="parent_id" cascade="delete" />
  <list name="menus" table="t_menu" inverse="false"  cascade="save-update" >
   <key column="parent_id" />
   <list-index column="listindex"/> 
   <one-to-many class="Menu"/>
  </list>
  <list name="actions" table="t_action" inverse="false" lazy="true" cascade="all" >
   <key column="menu_id" not-null="true"/>
   <list-index column="list_order"/>
   <one-to-many class="Action"/>
  </list>
 </class>
</hibernate-mapping>

《*******************************》

3、执行插入操作:

《*******************************》

public void testSave() {   
        Session session = HibernateSessionFactory.getSession();   
        session.beginTransaction();   
        // create role  
        Role role = new Role();   
        role.setRoleName("管理员");   
        // create menu   
        Menu menu = new Menu();   
        menu.setMenuName("人力资源");   
        // create relationship   
        role.getMenus().add(menu);   
        /* 因为主控方级联设置为all,如果设置为none,则下面被注释的代码需要开启,否则会报错 */   
        //session.save(menu);   
        session.save(role);
        //一定要加flush,不然不会执行级联更新(只会插入role表,而不会插入r_role_menu表),网上大部分资料都没有该句话
        session.flush();
        session.getTransaction().commit();   
        session.close();   
    }  

转载于:http://blog.csdn.net/kingkuang2006/article/details/6167670

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章