<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

      Sparta Yew

         簡約、職業、恒久
    隨筆 - 15, 文章 - 1, 評論 - 276, 引用 - 0
    數據加載中……

    hibernate3關聯映射表的級聯關系維護


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

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

        開發環境: eclipse3.4.2 + weblogic10.3 + jdk1.6.0_13 + Struts2.1.8 + Spring3.0.1 + Hiberante3.3.2


        在開發權限管理系統的過程中,我使用了Spring security3這個開源組件。

        這個開源組件功能是比較強大的,但是對于國人開發人員來說,存在不能用數據庫動態管理用戶、角色、權限、資源的缺陷(當然有對于用戶和權限的動態管理,但不適合國人開發人員)。為了滿足采用數據庫動態管理用戶、角色、權限、資源這個要求,筆者擴展了security3,除了建立上述4個表之外,還建立了用戶和角色的關聯表、角色和權限的關聯表、權限和資源的關聯表共計7張表。并為上述的7張表開發相關的設置模塊。

    就用戶和角色的關系來說,允許一個用戶關聯多個角色,它們之間是一對多的關系。
    就角色和權限的關系來說,允許一個角色關聯多個權限,它們之間是一對多的關系。
    就權限和資源的關系來說,允許一個權限關聯多個資源,它們之間是一對多的關系。

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

    在此給出必要的相關代碼,到于SSH2如何配置,如何部署運行,請參考相關的其他文章。

    一、Action-控制層代碼

    public class RolesAct extends ActionSupport {

           ……省略定義的私有變量。
        
            ……省略其他如查找、保存角色的方法。
        
        
    /*
         * 保存角色和權限之間一對多的關系。
         
    */

        
    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 {

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

        
    public void delete(String roleId) {
            log.debug(
    "根據角色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;
            }

        }


        
    /*
         * 保存角色和權限之間一對多的關系。
         
    */

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

            SysRoles sysRoles 
    = findById(roleId);
            SysAuthorities sysAuthorities 
    = null;
            SysRolesAuthorities sysRolesAuthorities;
            
            
    //在重新設置之前先刪除之前所擁有的全部對應關系
            sysRolesAuthoritiesDao.deleteOldRoleAndPermissionRelative( roleId );

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

                
    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>



        值得一提的是,在記錄下本文之前,在刪除某個角色的過程中Weblogic的后臺出現了“Could not execute JDBC batch update”的錯誤,這個錯誤的解決耗費了不少時間,隨著問題的明朗化,不斷地加深對hibernate的認識。這個錯誤的原因就是因為沒有為角色表的hibernate配置文件設置級聯關系,從而在刪除角色時,因為在用戶角色表和角色權限表中已經有與該角色相關的記錄,因此Oracle會報出“ORA-02292:違反完整約束條件”的錯誤,使整個刪除動作失敗。

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

        世界的一切對象皆隱藏于深深地迷霧之中,待撥開之后,才發現如此明朗和簡單,這需要興趣和勇氣。

        本文絕算不上是對技術高人的指導和開悟,而僅僅為自己的探索之路留下腳印,為初學之人點亮一束黑夜向前的火把,僅此而已亦足矣。

        不足之處,歡迎探討! 

     



                -東營 sparta-紫杉 原創,轉載請注明出處 :)
                http://www.tkk7.com/SpartaYew/
                SpartaYew@163.com
     
                
    QQ:22086526

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

    主站蜘蛛池模板: 午夜免费福利在线| 无码高潮少妇毛多水多水免费| 四虎永久免费地址在线观看| 2020国产精品亚洲综合网| 在线看片v免费观看视频777| 亚洲自偷自拍另类12p| 久久国产精品成人片免费| 亚洲伦理一区二区| 2021精品国产品免费观看| 亚洲成a人片毛片在线| 91九色精品国产免费| 亚洲伊人久久大香线蕉| 搡女人免费视频大全| 亚洲爆乳少妇无码激情| 亚洲国产综合久久天堂| 成年女人毛片免费播放视频m| 亚洲国产日产无码精品| 毛片视频免费观看| 国产亚洲综合一区二区三区| 亚洲午夜福利精品无码| 日韩视频免费在线观看| 亚洲另类自拍丝袜第1页| 国产资源免费观看| 99久久婷婷免费国产综合精品| 亚洲成AV人片一区二区| 国产免费一区二区三区| 激情小说亚洲图片| 国产亚洲av片在线观看16女人| 95老司机免费福利| 亚洲av成人一区二区三区观看在线| 亚洲伊人久久成综合人影院| 精品一区二区三区免费毛片爱 | 污视频在线观看免费| 亚洲一区二区三区深夜天堂| 国产精品无码免费视频二三区| 一级毛片免费全部播放| 亚洲国产精品人久久电影| 全亚洲最新黄色特级网站| 久久久高清日本道免费观看| 亚洲精品无码少妇30P| 亚洲国产一二三精品无码|