<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-紫杉 閱讀(705) 評論(0)  編輯  收藏 所屬分類: SSH2

    主站蜘蛛池模板: 亚洲成人免费在线| 免费看美女午夜大片| AAA日本高清在线播放免费观看| 亚洲精品麻豆av| 亚洲精品视频免费观看| 亚洲国产一区二区三区| 一进一出60分钟免费视频| 亚洲精品无码你懂的网站| 一二三区免费视频| 伊人婷婷综合缴情亚洲五月| caoporm超免费公开视频| 亚洲色精品88色婷婷七月丁香 | 国产l精品国产亚洲区在线观看| 羞羞视频免费网站日本| 亚洲AⅤ视频一区二区三区| 无码免费又爽又高潮喷水的视频| 国产乱辈通伦影片在线播放亚洲| 两个人www免费高清视频| 国产AV无码专区亚洲AVJULIA| 日韩午夜理论免费TV影院| 亚洲成在人线电影天堂色| 岛国av无码免费无禁网站| 亚洲爆乳AAA无码专区| 亚洲Av无码乱码在线播放| 国产免费无码一区二区| 亚洲av无码片在线观看| 国产在线观看免费视频播放器| 国产91成人精品亚洲精品| 亚洲精品卡2卡3卡4卡5卡区| 6080午夜一级毛片免费看| 亚洲精品无播放器在线播放 | 亚洲精品国产成人中文| 免费观看的av毛片的网站| 国产成人无码免费看片软件 | 亚洲人配人种jizz| yy6080亚洲一级理论| 99爱在线观看免费完整版| 亚洲高清乱码午夜电影网| 亚洲大尺度无码专区尤物| 国内外成人免费视频| 华人在线精品免费观看|