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

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

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

    神奇好望角 The Magical Cape of Good Hope

    庸人不必自擾,智者何需千慮?
    posts - 26, comments - 50, trackbacks - 0, articles - 11
      BlogJava :: 首頁 ::  :: 聯(lián)系 :: 聚合  :: 管理

    實(shí)體間的多對(duì)多的關(guān)聯(lián)需要一張關(guān)聯(lián)表。如果直接使用 ManyToMany 來映射,JPA 就會(huì)隱式地幫我們自動(dòng)管理關(guān)聯(lián)表,代碼寫出來和其他類型的關(guān)聯(lián)差別不大。例如,某州炒房團(tuán)需要一個(gè)炒房跟蹤系統(tǒng),那么該系統(tǒng)中的炒房客和房子就是多對(duì)多的關(guān)系:

            public class Speculator implements Serializable {
                @Id
                private Integer id;
                @ManyToMany
                @JoinTable(joinColumns = @JoinColumn(name = "speculator_id"),
                        inverseJoinColumns = @JoinColumn(name = "house_id"))
                private List<House> houses;
                // 此處省略若干行
            }
    
            public class House implements Serializable {
                @Id
                private Integer id;
                @ManyToMany(mappedBy = "houses")
                private List<Speculator> speculators;
                // 此處省略若干行
            }
        

    如果炒房客 s 要賣掉房子 h(嚴(yán)格點(diǎn)說是賣掉房子的產(chǎn)權(quán)部分),那么系統(tǒng)執(zhí)行的代碼差不多就是 s.getHouses().remove(h)。看似簡單,然而底層的操作卻性能低下:JPA 會(huì)先從數(shù)據(jù)庫中取出炒房客的所有房產(chǎn)(s.getHouses()),然后再刪除指定的那套房子;從數(shù)據(jù)庫層面上看,這將先從關(guān)聯(lián)表(speculator_house)中找到該炒房客的所有房子的外鍵,然后從 house 表載入這些 House 對(duì)象,最后才從 speculator_house 刪除關(guān)聯(lián)。在 ORM 出現(xiàn)前,這種操作只需要改關(guān)聯(lián)表,根本不用關(guān)心其他房子。這種簡單的多對(duì)多映射寫法將關(guān)聯(lián)表隱藏起來,雖然簡化了代碼,卻也可能帶來性能隱患。

    很自然地可以想到,如果把關(guān)聯(lián)表也映射成實(shí)體類,就能解決這個(gè)問題。speculator_house 包含兩個(gè)外鍵,可用作聯(lián)合主鍵。如果把它映射為 SpeculatorHouse 類,則該類與 SpeculatorHouse 都是多對(duì)一的關(guān)系。關(guān)聯(lián)表實(shí)體類的代碼如下(EmbeddedId 的映射技巧見《JPA 應(yīng)用技巧 2:主鍵外鍵合體映射》):

            @Embeddable
            public class SpeculatorHouseId implements Serializable {
                private Integer speculatorId;
                private Integer houseId;
                // 此處省略若干行
            }
    
            @Entity
            @Table(name = "speculator_house")
            public class SpeculatorHouse implements Serializable {
                @EmbeddedId
                private SpeculatorHouseId id;
                @MapsId("speculatorId")
                @ManyToOne
                private Speculator speculator;
                @MapsId("houseId")
                @ManyToOne
                private House house;
                // 此處省略若干行
            }
        

    SpeculatorHouse 也要增加相應(yīng)的關(guān)聯(lián)信息:

            public class Speculator implements Serializable {
                @Id
                private Integer id;
                @ManyToMany
                @JoinTable(joinColumns = @JoinColumn(name = "speculator_id"),
                        inverseJoinColumns = @JoinColumn(name = "house_id"))
                private List<House> houses;
                @OneToMany(mappedBy = "speculator")
                private List<SpeculatorHouse> speculatorHouses;
                // 此處省略若干行
            }
    
            public class House implements Serializable {
                @Id
                private Integer id;
                @ManyToMany(mappedBy = "houses")
                private List<Speculator> speculators;
                @OneToMany(mappedBy = "house")
                private List<SpeculatorHouse> speculatorHouses;
                // 此處省略若干行
            }
        

    這樣既保留了多對(duì)多關(guān)系,又映射了關(guān)聯(lián)表,然后就可以根據(jù)實(shí)際情況選擇隱式或顯示的關(guān)聯(lián)表管理。例如,要得到一個(gè)炒房客的全部房子,就使用隱式管理:s.getHouses();而要?jiǎng)h除炒房客和某套房子的關(guān)聯(lián),則用顯示管理:delete from SpeculatorHouse sh where sh.speculator = :s and sh.house = :h


    評(píng)論

    # re: JPA 應(yīng)用技巧 3:映射多對(duì)多的關(guān)聯(lián)表[未登錄]  回復(fù)  更多評(píng)論   

    2012-06-14 16:05 by DD
    但是,我按照你這樣配起來,怎么刪speculator?。。我現(xiàn)在無法刪除speculator。

    # re: JPA 應(yīng)用技巧 3:映射多對(duì)多的關(guān)聯(lián)表  回復(fù)  更多評(píng)論   

    2012-10-11 15:06 by merge
    對(duì)于中間表操作描述詳細(xì),收藏了!
    主站蜘蛛池模板: 亚洲伊人久久大香线蕉AV| 亚洲激情在线视频| 亚洲国产成人手机在线观看| 在线永久看片免费的视频| 亚洲最大在线观看| 精品免费人成视频app | 无码人妻一区二区三区免费手机| 亚洲产国偷V产偷V自拍色戒| 国内少妇偷人精品视频免费| 国产AV无码专区亚洲AV男同| 99在线免费观看视频| 337p日本欧洲亚洲大胆色噜噜| 亚州免费一级毛片| 在线aⅴ亚洲中文字幕| 日本19禁啪啪无遮挡免费动图| 亚洲国产精品日韩av不卡在线| 午夜国产大片免费观看| 一区二区三区在线免费| 亚洲乱码无码永久不卡在线| 99久9在线|免费| 亚洲欧美自偷自拍另类视| 亚洲国产精品无码久久久久久曰| 中文字幕手机在线免费看电影| 亚洲精品蜜桃久久久久久| 国内精自视频品线六区免费| 亚洲欧美黑人猛交群| 亚洲成av人片在线观看天堂无码 | 久久久久亚洲av无码专区导航| 青草草色A免费观看在线| 亚洲国产精品嫩草影院| 久久激情亚洲精品无码?V| 全部免费毛片在线播放| 亚洲欧美成人综合久久久| 亚洲色一色噜一噜噜噜| 亚洲视频在线免费播放| 精品亚洲成A人在线观看青青| 亚洲日韩av无码| 夫妻免费无码V看片| 99视频在线观看免费| 亚洲首页国产精品丝袜| 中文字幕亚洲一区二区三区|