<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)系 :: 聚合  :: 管理

    實體間的多對多的關(guān)聯(lián)需要一張關(guān)聯(lián)表。如果直接使用 ManyToMany 來映射,JPA 就會隱式地幫我們自動管理關(guān)聯(lián)表,代碼寫出來和其他類型的關(guān)聯(lián)差別不大。例如,某州炒房團需要一個炒房跟蹤系統(tǒng),那么該系統(tǒng)中的炒房客和房子就是多對多的關(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)格點說是賣掉房子的產(chǎn)權(quán)部分),那么系統(tǒng)執(zhí)行的代碼差不多就是 s.getHouses().remove(h)。看似簡單,然而底層的操作卻性能低下:JPA 會先從數(shù)據(jù)庫中取出炒房客的所有房產(chǎn)(s.getHouses()),然后再刪除指定的那套房子;從數(shù)據(jù)庫層面上看,這將先從關(guān)聯(lián)表(speculator_house)中找到該炒房客的所有房子的外鍵,然后從 house 表載入這些 House 對象,最后才從 speculator_house 刪除關(guān)聯(lián)。在 ORM 出現(xiàn)前,這種操作只需要改關(guān)聯(lián)表,根本不用關(guān)心其他房子。這種簡單的多對多映射寫法將關(guān)聯(lián)表隱藏起來,雖然簡化了代碼,卻也可能帶來性能隱患。

    很自然地可以想到,如果把關(guān)聯(lián)表也映射成實體類,就能解決這個問題。speculator_house 包含兩個外鍵,可用作聯(lián)合主鍵。如果把它映射為 SpeculatorHouse 類,則該類與 SpeculatorHouse 都是多對一的關(guān)系。關(guān)聯(lián)表實體類的代碼如下(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;
                // 此處省略若干行
            }
        

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


    評論

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

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

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

    2012-10-11 15:06 by merge
    對于中間表操作描述詳細(xì),收藏了!
    主站蜘蛛池模板: 59pao成国产成视频永久免费| 免费无码成人AV片在线在线播放| 亚洲欧洲日本精品| 国产成人免费a在线视频app| 亚洲va无码va在线va天堂| 最近免费视频中文字幕大全| 亚洲中文字幕无码爆乳AV| 看免费毛片天天看| 亚洲成av人片在线观看无码不卡| 四虎免费影院ww4164h| 一级毛片免费观看不收费| 免费a级黄色毛片| 99免费在线观看视频| 亚洲网站在线观看| 国产传媒在线观看视频免费观看| 亚洲人成色777777老人头| 亚洲AV无码久久精品色欲| 免费无码H肉动漫在线观看麻豆| 亚洲国产最大av| 青青青国产免费一夜七次郎| 亚洲字幕AV一区二区三区四区| 亚洲国产一成人久久精品| 国产精品深夜福利免费观看| 四虎免费影院ww4164h| 99精品热线在线观看免费视频| 亚洲国产高清人在线| 91麻豆最新在线人成免费观看| 中文字幕a∨在线乱码免费看| 亚洲国产无线乱码在线观看| 国产一区在线观看免费| 在线观看免费大黄网站| 瑟瑟网站免费网站入口| 久久水蜜桃亚洲AV无码精品| 最新亚洲人成无码网www电影| 中文字幕亚洲天堂| 37pao成人国产永久免费视频 | 亚洲成人一区二区| 亚洲精品人成无码中文毛片| 亚洲一区免费观看| 亚洲aⅴ无码专区在线观看春色| 亚洲精品二区国产综合野狼 |