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

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

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

    隨筆-42  評論-578  文章-1  trackbacks-0
    近來,在做的一個NewsMS項目中,需要用到多對多關(guān)聯(lián)映射,以下是項目中用到的兩個實體類:用戶類User和角色類Role,它們之間是多對多的關(guān)系。
    //用戶表
    @Entity
    @Table(name
    ="rong_user")
    public class User{

        
    //省略其它內(nèi)容

        
    private Set<Role> roles = new LinkedHashSet<Role>();    //角色集合
        
        @ManyToMany(cascade 
    = {CascadeType.PERSIST, CascadeType.MERGE})
        @JoinTable(name 
    = "rong_user_role", joinColumns = { @JoinColumn(name ="user_id" )}, inverseJoinColumns = { @JoinColumn(name = "role_id") })
        @OrderBy(
    "id")
        
    public Set<Role> getRoles() {
            
    return roles;
        }

        
    public void setRoles(Set<Role> roles) {
            
    this.roles = roles;
        }

    }

    //角色表
    @Entity
    @Table(name
    ="rong_role")
    public class Role{
        
        
    //省略其它內(nèi)容

        
    private Set<User> user = new LinkedHashSet<User>();        //用戶集合

        @ManyToMany(cascade 
    = {CascadeType.PERSIST, CascadeType.MERGE}, mappedBy = "roles", fetch = FetchType.LAZY)
        
    public Set<User> getUser() {
            
    return user;
        }

        
    public void setUser(Set<User> user) {
            
    this.user = user;
        }

    }


             這兩個生成數(shù)據(jù)庫中的三個表,分別是rong_user, rong_role和一個中間表rong_user_role。
             Hibernate和JPA控制關(guān)聯(lián)關(guān)系的,只能是一方,不能雙方控制的,上面的程序中,我通過在Role類中設(shè)置mappedBy="roles"來設(shè)置由User來控制關(guān)系,
             這樣,問題就出現(xiàn)了:當(dāng)我在要刪除角色Role時,如果沒有用戶擁有這個角色的話,就能成功刪除;如果有用戶擁有這個角色的時候,就不能刪除,會拋以下異常:
    12:53:33,125  WARN JDBCExceptionReporter:100 - SQL Error: 1451, SQLState: 23000
    12:53:33,125 ERROR JDBCExceptionReporter:101 - Cannot delete or update a parent row: a foreign key constraint fails (`newsms/rong_user_role`, CONSTRAINT `FKF1698421A337A5FA` FOREIGN KEY (`role_id`) REFERENCES `rong_role` (`id`))
    12:53:33,171 ERROR AbstractFlushingEventListener:324 - Could not synchronize database state with session
    org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    /****堆棧信息略****/
    Caused by: java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`newsms/rong_user_role`, CONSTRAINT `FKF1698421A337A5FA` FOREIGN KEY (`role_id`) REFERENCES `rong_role` (`id`))
    /******堆棧信息略*****/

          當(dāng)我設(shè)置成單向關(guān)系映射時,即把Role類中,Set<User>信息去掉,這樣,也不能刪,原因也是說有外鍵約束!怎么辦?
          苦惱了好幾天,最后,只能歸于Hibernate(JPA)的多對多關(guān)聯(lián)映射設(shè)計得有點不符實際!就像上面我說的例子,有人選了某角色,就不能刪掉該角色。還有一種做法是,在Role類中:
    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE,CascadeType.REMOVE}, mappedBy = "roles", fetch = FetchType.LAZY)
        
    public Set<User> getUser() {
            
    return user;
        }
            即加多一個“CascadeType.REMOVE”,這樣能把角色Role給刪掉了,但連擁有該角色的所有用戶User也被級聯(lián)刪掉了。這樣來看,某個用戶擁有許多角色,就因為其中有這一個角色,就被級聯(lián)刪了整個自己,那不是很冤枉。這也不符合實際!
            個人認為,Hibernate(JPA)在設(shè)置多對多關(guān)聯(lián)映射時,應(yīng)該有做法能使得雙方都能控制關(guān)聯(lián)關(guān)系才好,才符合實際吧!但事實上,好像還沒有發(fā)現(xiàn)有Hibernate(JPA)這種能力!


    本文原創(chuàng),轉(zhuǎn)載請注明出處,謝謝!http://m.tkk7.com/rongxh7(心夢帆影JavaEE技術(shù)博客)
        

    posted on 2009-06-08 13:33 心夢帆影 閱讀(26944) 評論(15)  編輯  收藏 所屬分類: HibernateJPA

    評論:
    # re: Hibernate(JPA)多對多(ManyToMany)關(guān)聯(lián)映射不完美之處 2009-06-08 18:18 | 虎嘯龍吟
    這樣就是符合實際啊:當(dāng)某個用戶擁有某個角色的時候,不應(yīng)該刪除該角色吧!  回復(fù)  更多評論
      
    # re: Hibernate(JPA)多對多(ManyToMany)關(guān)聯(lián)映射不完美之處 2009-06-08 18:26 | 心夢帆影
    @虎嘯龍吟
    用戶與角色是多對多的關(guān)系,如果系統(tǒng)不需要或個角色了,而因為有用戶跟這個角色有關(guān)聯(lián),而刪不了!那怎么對角色進行管理?只能添加,修改,不能刪除?  回復(fù)  更多評論
      
    # re: Hibernate(JPA)多對多(ManyToMany)關(guān)聯(lián)映射不完美之處 2009-06-08 19:20 | YangL
    LZ也在用SpringSide吧,呵呵  回復(fù)  更多評論
      
    # re: Hibernate(JPA)多對多(ManyToMany)關(guān)聯(lián)映射不完美之處 2009-06-08 21:01 | 心夢帆影
    @YangL
    被你看穿了,呵呵
    但我沒有直接把Springside當(dāng)組件用,而是學(xué)習(xí)它!
    有興趣交流一下不?我QQ:121040245,呵呵  回復(fù)  更多評論
      
    # re: Hibernate(JPA)多對多(ManyToMany)關(guān)聯(lián)映射不完美之處 2009-06-08 21:18 | 小人物
    學(xué)習(xí)了!  回復(fù)  更多評論
      
    # re: Hibernate(JPA)多對多(ManyToMany)關(guān)聯(lián)映射不完美之處 2009-06-09 20:44 | huliqing
    這不應(yīng)該是hibernate的不完美之處,數(shù)據(jù)庫的這個作法是正確的,這涉及到數(shù)據(jù)完整與安全性的問題。我認為你應(yīng)該先明確的處理掉相關(guān)的持有該角色的相關(guān)用戶的對于該角色的關(guān)系。也就是說先刪除相關(guān)用戶對該角色的持有關(guān)系,再刪除該角色就沒有問題。
    或者選擇不作外鍵約束,但是這樣就會對比較嚴格的系統(tǒng)造成數(shù)據(jù)冗余,不完整,還包括安全問題。  回復(fù)  更多評論
      
    # re: Hibernate(JPA)多對多(ManyToMany)關(guān)聯(lián)映射不完美之處 2009-06-11 00:33 | 虎嘯龍吟
    @YangL
    可以先去掉該用戶的角色,再刪除該角色啊  回復(fù)  更多評論
      
    # re: Hibernate(JPA)多對多(ManyToMany)關(guān)聯(lián)映射不完美之處 2012-12-23 11:32 | lin
    雙方都用OneToMany就行了  回復(fù)  更多評論
      
    # re: Hibernate(JPA)多對多(ManyToMany)關(guān)聯(lián)映射不完美之處[未登錄] 2013-06-15 13:01 | James
    關(guān)聯(lián)關(guān)系不要雙方配置 只在主表配置  回復(fù)  更多評論
      
    # re: Hibernate(JPA)多對多(ManyToMany)關(guān)聯(lián)映射不完美之處[未登錄] 2013-06-15 13:03 | James
    @ManyToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE})
    @JoinTable(name = "adgroup_ad", joinColumns = { @JoinColumn(name = "adgroup_id") }, inverseJoinColumns = { @JoinColumn(name = "ad_version_id") })
    這是我的項目的主表部分的注解配置 測試增加修改都可以 刪除也只刪除關(guān)聯(lián)關(guān)系  回復(fù)  更多評論
      
    # re: Hibernate(JPA)多對多(ManyToMany)關(guān)聯(lián)映射不完美之處[未登錄] 2013-06-15 13:10 | James
    汗 SORRY 發(fā)現(xiàn)我的問題和你的不一樣的 我這里還是會出現(xiàn)你說的這種情況 SORRY 看來它還真是設(shè)計有點不合理的  回復(fù)  更多評論
      
    # re: Hibernate(JPA)多對多(ManyToMany)關(guān)聯(lián)映射不完美之處 2013-09-02 10:49 | phevose
    這在業(yè)務(wù)邏輯上是完全合理的,正在被使用的角色是不應(yīng)該被刪除的,如果刪除那么應(yīng)該做級聯(lián)刪除,對應(yīng)的用戶也應(yīng)該一并刪除,或者應(yīng)該先解除關(guān)聯(lián)關(guān)系后再刪除該角色。  回復(fù)  更多評論
      
    # re: Hibernate(JPA)多對多(ManyToMany)關(guān)聯(lián)映射不完美之處 2014-11-14 16:16 | 雪妮星跡
    樓主想要的級聯(lián)功能,可以使用數(shù)據(jù)庫的外鍵約束控制。  回復(fù)  更多評論
      
    # re: Hibernate(JPA)多對多(ManyToMany)關(guān)聯(lián)映射不完美之處 2015-01-27 15:20 | lp
    @心夢帆影
    可以不建立外鍵關(guān)聯(lián),通過應(yīng)用控制數(shù)據(jù)的完整性。  回復(fù)  更多評論
      
    # re: Hibernate(JPA)多對多(ManyToMany)關(guān)聯(lián)映射不完美之處 2016-04-07 15:10 | coolcjava
    只有兩個實體類都配置了joinColumns和inverseJoinColumns屬性,并且位置互相調(diào)換,就可以使用雙向維護  回復(fù)  更多評論
      
    主站蜘蛛池模板: 国产免费一区二区三区不卡| 国产成人亚洲精品91专区高清| 91成人免费福利网站在线| 亚洲AV蜜桃永久无码精品| 色视频在线观看免费| 免费萌白酱国产一区二区| 国产精品亚洲专区无码不卡| 国产精品色午夜视频免费看| 亚洲AV无码男人的天堂| 免费一级国产生活片| 一级女性全黄生活片免费看| 亚洲中文字幕久久精品无码APP| 男人天堂免费视频| 亚洲视频在线免费看| 最近的免费中文字幕视频| 亚洲AV无码XXX麻豆艾秋| 无码欧精品亚洲日韩一区夜夜嗨 | 亚洲欧洲日产专区| 成年午夜视频免费观看视频| 久久亚洲精品11p| 国产成人亚洲综合无码| 未满十八18禁止免费无码网站| 亚洲精品电影天堂网| 免费看大美女大黄大色| 免费人妻精品一区二区三区| 国产亚洲精久久久久久无码| 67194国产精品免费观看| 亚洲日本VA午夜在线电影| 亚洲精品无码AV中文字幕电影网站| 一级有奶水毛片免费看| 亚洲明星合成图综合区在线| 午夜神器成在线人成在线人免费| 羞羞网站在线免费观看| 欧洲亚洲国产清在高| 24小时日本在线www免费的| 四虎成人精品国产永久免费无码| 日韩亚洲欧洲在线com91tv| 一个人看www在线高清免费看| 色www免费视频| 亚洲视频在线免费观看| 四虎成人免费网址在线|