<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 :: 首頁(yè) ::  :: 聯(lián)系 :: 聚合  :: 管理

    考慮兩個(gè)具有一對(duì)一關(guān)聯(lián)的實(shí)體類,受控方除了有一個(gè)自己的主鍵,還有一個(gè)引用主控方的外鍵。如果主控方和受控方是同生同滅的關(guān)系,換句話說(shuō),雙方的一對(duì)一關(guān)聯(lián)一旦確立就不可更改,就可以考慮讓雙方共享相同的主鍵,簡(jiǎn)化受控方的表結(jié)構(gòu)。下面就讓樓主通過(guò)實(shí)例來(lái)說(shuō)明如何用 JPA 2.0 來(lái)實(shí)現(xiàn)這種映射。

    盯著眼前的電腦,樓主想到了一個(gè)也許不太貼切的例子:?jiǎn)T工和公司配的電腦的關(guān)系。員工的主鍵就是工號(hào)。雖然電腦可能被換掉,但電腦實(shí)體完全可以用工號(hào)做主鍵,只是把電腦配置的詳細(xì)信息改掉而已。此處的難點(diǎn)就在與如何將電腦的主鍵字段同時(shí)映射一個(gè)員工,請(qǐng)看樓主是怎么一步步推導(dǎo)出來(lái)的。

    一開(kāi)始是最想當(dāng)然的寫(xiě)法:

            public class Computer implements Serializable {
                @Id
                @OneToOne
                private Employee employee;
                // 此處省略若干行
            }
        

    然而根據(jù)規(guī)范,只有這些類型可以作為主鍵:Java 原始類型(例如 int)、原始包裝類型(例如 Integer)、Stringjava.util.Datejava.sql.Datejava.math.BigDecimaljava.math.BigInteger。所以直接拿 Employee 做主鍵是不行的。順便提一下,也許某些 JPA 實(shí)現(xiàn)自己做了擴(kuò)展,使得可以直接拿實(shí)體類做主鍵,這已經(jīng)超出了 JPA 規(guī)范的范疇,此處不討論。

    直接映射是行不通了,那有什么間接的方式嗎?這時(shí)樓主想起了一個(gè)特殊的注解:EmbeddedId。該注解的本意是用于聯(lián)合主鍵,不過(guò)變通一下,是否可以將 Employee 包裝進(jìn)一個(gè)嵌入式主鍵,然后再將這個(gè)嵌入式主鍵作為 Computer 的主鍵以達(dá)到目的?帶著這種想法,樓主有了下面的代碼:

            @Embeddable
            public class ComputerId implements Serializable {
                @OneToOne
                private Employee employee;
                // 此處省略若干行
            }
        
            public class Computer implements Serializable {
                @EmbeddedId
                private ComputerId id;
                // 此處省略若干行
            }
        

    現(xiàn)在又出現(xiàn)了新的問(wèn)題:JPA 不支持定義在嵌入式主鍵類中的關(guān)聯(lián)映射。好在天無(wú)絕人之路,EmbeddedId 的文檔中直接指出,可以使用 MapsId 注解來(lái)間接指定嵌入式主鍵類中的關(guān)聯(lián)映射,而且還附帶了一個(gè)例子!于是最終的成品就出爐了:

            @Embeddable
            public class ComputerId implements Serializable {
                private String employeeId;
                // 此處省略若干行
            }
        
            public class Computer implements Serializable {
                @EmbeddedId
                private Employee employee;
                @MapsId("employeeId")
                @OneToOne
                private Employee employee;
                // 此處省略若干行
            }
        

    唯一的遺憾是,邏輯上的主控方 Employee 現(xiàn)在不得不成為受控方了,好在可以定義級(jí)聯(lián)操作來(lái)達(dá)到差不多的效果:

            public class Employee implements Serializable {
                @Id
                private String id;
                @OneToOne(mappedBy = "employee", cascade = CascadeType.ALL)
                private Computer computer;
                // 此處省略若干行
            }
        

    雖然做到了,但確實(shí)挺繞的。希望未來(lái)版本的 JPA 能直接支持將實(shí)體類作為主鍵,樓主個(gè)人覺(jué)得不是一個(gè)技術(shù)問(wèn)題。

    主站蜘蛛池模板: 亚洲精品美女久久久久99小说| 精品少妇人妻AV免费久久洗澡| 国产亚洲大尺度无码无码专线 | 国产午夜亚洲精品国产成人小说| 亚洲欧美一区二区三区日产| 午夜神器成在线人成在线人免费| 亚洲成av人无码亚洲成av人| 免费看男女下面日出水视频| 无遮挡免费一区二区三区| 亚洲片一区二区三区| 成人无码a级毛片免费| 亚洲av综合av一区| 99久久久国产精品免费无卡顿 | 亚洲一级在线观看| 久久综合AV免费观看| 亚洲aⅴ天堂av天堂无码麻豆 | 亚洲av色影在线| 真人做A免费观看| 亚洲精品成a人在线观看夫| 夜色阁亚洲一区二区三区| 国产成人无码免费看片软件| 国产亚洲一区二区三区在线观看 | 无遮挡a级毛片免费看| 亚洲国产成人片在线观看无码| 久久精品视频免费播放| 亚洲一卡2卡4卡5卡6卡在线99| 国产精品极品美女免费观看 | 亚洲一本之道高清乱码| av无码东京热亚洲男人的天堂| 在线观看片免费人成视频无码 | 免费人成在线观看播放a| 亚洲高清专区日韩精品| 国产va精品免费观看| 色婷婷综合缴情综免费观看| 久久久久亚洲AV成人无码网站 | 亚洲天堂福利视频| www.91亚洲| 免费观看无遮挡www的小视频| 亚洲AV无码成人精品区日韩| 日韩va亚洲va欧洲va国产| 在线观看人成网站深夜免费|