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

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