Sparta Yew

               簡(jiǎn)約、職業(yè)、恒久
          隨筆 - 15, 文章 - 1, 評(píng)論 - 276, 引用 - 0
          數(shù)據(jù)加載中……

          hibernate3關(guān)聯(lián)映射表的級(jí)聯(lián)關(guān)系維護(hù)


              --Could not execute JDBC batch update問題解決

              sparta-紫杉 10/4/22  13:40

              開發(fā)環(huán)境: eclipse3.4.2 + weblogic10.3 + jdk1.6.0_13 + Struts2.1.8 + Spring3.0.1 + Hiberante3.3.2


              在開發(fā)權(quán)限管理系統(tǒng)的過程中,我使用了Spring security3這個(gè)開源組件。

              這個(gè)開源組件功能是比較強(qiáng)大的,但是對(duì)于國(guó)人開發(fā)人員來(lái)說(shuō),存在不能用數(shù)據(jù)庫(kù)動(dòng)態(tài)管理用戶、角色、權(quán)限、資源的缺陷(當(dāng)然有對(duì)于用戶和權(quán)限的動(dòng)態(tài)管理,但不適合國(guó)人開發(fā)人員)。為了滿足采用數(shù)據(jù)庫(kù)動(dòng)態(tài)管理用戶、角色、權(quán)限、資源這個(gè)要求,筆者擴(kuò)展了security3,除了建立上述4個(gè)表之外,還建立了用戶和角色的關(guān)聯(lián)表、角色和權(quán)限的關(guān)聯(lián)表、權(quán)限和資源的關(guān)聯(lián)表共計(jì)7張表。并為上述的7張表開發(fā)相關(guān)的設(shè)置模塊。

          就用戶和角色的關(guān)系來(lái)說(shuō),允許一個(gè)用戶關(guān)聯(lián)多個(gè)角色,它們之間是一對(duì)多的關(guān)系。
          就角色和權(quán)限的關(guān)系來(lái)說(shuō),允許一個(gè)角色關(guān)聯(lián)多個(gè)權(quán)限,它們之間是一對(duì)多的關(guān)系。
          就權(quán)限和資源的關(guān)系來(lái)說(shuō),允許一個(gè)權(quán)限關(guān)聯(lián)多個(gè)資源,它們之間是一對(duì)多的關(guān)系。

              限于篇附,僅介紹角色和權(quán)限維護(hù)及關(guān)聯(lián)關(guān)系維護(hù)的模塊,并且僅介紹相關(guān)的保存和刪除的代碼。角色表為Sys_Roles、權(quán)限表為Sys_Authorities、兩者的關(guān)聯(lián)表為Sys_Roles_Authorities。在角色和權(quán)限的關(guān)聯(lián)關(guān)系維護(hù)頁(yè)面,可以允許用戶添加角色;并且可以通過某個(gè)角色查找到與該角色相關(guān)的權(quán)限列表;還可以根據(jù)某個(gè)角色,通過checkbox選中多個(gè)權(quán)限列表,以保存該角色與多個(gè)權(quán)限之間的關(guān)系。

          在此給出必要的相關(guān)代碼,到于SSH2如何配置,如何部署運(yùn)行,請(qǐng)參考相關(guān)的其他文章。

          一、Action-控制層代碼

          public class RolesAct extends ActionSupport {

                 ……省略定義的私有變量。
              
                  ……省略其他如查找、保存角色的方法。
              
              
          /*
               * 保存角色和權(quán)限之間一對(duì)多的關(guān)系。
               
          */

              
          public String savePermissionAndRole(){
                  
                  rolesBuz.savePermissionAndRole( roleId,permisskey );

                  
          return SUCCESS;
              }

              
              
          /*
               * 刪除角色
               
          */

              
          public String deleteRole(){

                  rolesBuz.deleteRole( roleId );
                  
                  
          return SUCCESS;
              }

              
                  ……省略getter和setter
          }

           

          二、dao-持久層代碼

          public class SysRolesDao extends HibernateDaoSupport {

              
          /**
               * 根據(jù)角色id刪除該角色。
               * 
               * 
          @author sparta 
               *
          @param roleId
               
          */

              
          public void delete(String roleId) {
                  log.debug(
          "根據(jù)角色id刪除該角色!角色id為 : " + roleId);
                  
          try {
                      
                      SysRoles role 
          = findById( roleId );
                      
                      getHibernateTemplate().delete( role );
                  
                      log.debug(
          "角色id" + roleId + "刪除成功!");
                  }
           catch (RuntimeException re) {
                      log.error(
          "角色id" + roleId + "刪除失敗!", re);
                      
          throw re;
                  }

              }


              
          /*
               * 保存角色和權(quán)限之間一對(duì)多的關(guān)系。
               
          */

              
          public boolean savePermissionAndRole(String roleId, String[] permisskey) {

                  SysRoles sysRoles 
          = findById(roleId);
                  SysAuthorities sysAuthorities 
          = null;
                  SysRolesAuthorities sysRolesAuthorities;
                  
                  
          //在重新設(shè)置之前先刪除之前所擁有的全部對(duì)應(yīng)關(guān)系
                  sysRolesAuthoritiesDao.deleteOldRoleAndPermissionRelative( roleId );

                  
          try {
                                  
          /*
                       * 將用戶在前臺(tái)通過checkbox選中的所有權(quán)限id(參數(shù)permisskey)提取出來(lái)。
                       * 在進(jìn)行保存之前,首先要通過id提取該權(quán)限的實(shí)例,
                       * 為角色權(quán)限關(guān)聯(lián)表sysRolesAuthorities的setSysAuthorities()提供數(shù)據(jù)。
                       * 最后通過hibernate的save()方法保存新建的sysRolesAuthorities實(shí)例。
                       
          */

                      
          for (String perId : permisskey) {
                          sysAuthorities 
          = sysAuthoritiesDao.findById(perId);

                          sysRolesAuthorities 
          = new SysRolesAuthorities();
                          sysRolesAuthorities.setId(Util.getPkId());
                          sysRolesAuthorities.setSysRoles(sysRoles);
                          sysRolesAuthorities.setSysAuthorities(sysAuthorities);
                          sysRolesAuthorities.setEnabled(
          true);

                          getHibernateTemplate().save(sysRolesAuthorities);
                      }

                      
                  }
           catch (Exception ex) {
                      ex.printStackTrace();
                      
          return false;
                  }

                  
          return true;
              }

          }





          三、表的hibernate配置文件SysRoles.hbm.xml

           

          <hibernate-mapping>
              
          <class name="avatar.base.security.entity.SysRoles" table="SYS_ROLES" schema="SCJDGL">
                  
          <id name="roleId" type="string">
                      
          <column name="ROLE_ID" length="32" />
                      
          <generator class="assigned" />
                  
          </id>
                  
          <property name="roleName" type="string">
                      
          <column name="ROLE_NAME" length="40" />
                  
          </property>
                  
          <property name="roleDesc" type="string">
                      
          <column name="ROLE_DESC" length="100" />
                  
          </property>
                  
          <property name="enabled" type="java.lang.Boolean">
                      
          <column name="ENABLED" precision="1" scale="0" />
                  
          </property>
                  
          <property name="issys" type="java.lang.Boolean">
                      
          <column name="ISSYS" precision="1" scale="0" />
                  
          </property>
                  
          <property name="module" type="string">
                      
          <column name="MODULE" length="4" />
                  
          </property>
                  
          <set name="sysUsersRoles" inverse="true" cascade="all">
                      
          <key>
                          
          <column name="ROLE_ID" length="32" />
                      
          </key>
                      
          <one-to-many class="avatar.base.security.entity.SysUsersRoles"/>
                  
          </set>
                  
          <set name="sysRolesAuthorities" inverse="true" cascade="all">
                      
          <key>
                          
          <column name="ROLE_ID" length="32" />
                      
          </key>
                      
          <one-to-many class="avatar.base.security.entity.SysRolesAuthorities" />
                  
          </set>
              
          </class>
          </hibernate-mapping>



              值得一提的是,在記錄下本文之前,在刪除某個(gè)角色的過程中Weblogic的后臺(tái)出現(xiàn)了“Could not execute JDBC batch update”的錯(cuò)誤,這個(gè)錯(cuò)誤的解決耗費(fèi)了不少時(shí)間,隨著問題的明朗化,不斷地加深對(duì)hibernate的認(rèn)識(shí)。這個(gè)錯(cuò)誤的原因就是因?yàn)闆]有為角色表的hibernate配置文件設(shè)置級(jí)聯(lián)關(guān)系,從而在刪除角色時(shí),因?yàn)樵谟脩艚巧砗徒巧珯?quán)限表中已經(jīng)有與該角色相關(guān)的記錄,因此Oracle會(huì)報(bào)出“ORA-02292:違反完整約束條件”的錯(cuò)誤,使整個(gè)刪除動(dòng)作失敗。

              解決的方法很簡(jiǎn)單,可以參見本文中“表的hibernate配置文件”中的代碼字句“cascade=all”,加上它一切都OK了。

              世界的一切對(duì)象皆隱藏于深深地迷霧之中,待撥開之后,才發(fā)現(xiàn)如此明朗和簡(jiǎn)單,這需要興趣和勇氣。

              本文絕算不上是對(duì)技術(shù)高人的指導(dǎo)和開悟,而僅僅為自己的探索之路留下腳印,為初學(xué)之人點(diǎn)亮一束黑夜向前的火把,僅此而已亦足矣。

              不足之處,歡迎探討! 

           



                      -東營(yíng) sparta-紫杉 原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處 :)
                      http://www.aygfsteel.com/SpartaYew/
                      SpartaYew@163.com
           
                      
          QQ:22086526

          posted on 2011-05-19 08:40 sparta-紫杉 閱讀(712) 評(píng)論(0)  編輯  收藏 所屬分類: SSH2

          主站蜘蛛池模板: 龙里县| 凌海市| 梅河口市| 阳春市| 仲巴县| 招远市| 广元市| 保靖县| 德江县| 阿拉尔市| 海林市| 崇明县| 淄博市| 玉环县| 吉林省| 辽阳市| 北川| 泸西县| 昆明市| 金塔县| 博白县| 平乡县| 石棉县| 丽水市| 桃园县| 阿克苏市| 扶风县| 呼玛县| 墨竹工卡县| 乡城县| 灵宝市| 巴林左旗| 个旧市| 哈巴河县| 新安县| 禄丰县| 汉阴县| 沿河| 天祝| 尖扎县| 同仁县|