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

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

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

    每日一得

    不求多得,只求一得 about java,hibernate,spring,design,database,Ror,ruby,快速開發(fā)
    最近關(guān)心的內(nèi)容:SSH,seam,flex,敏捷,TDD
    本站的官方站點(diǎn)是:顛覆軟件

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      220 隨筆 :: 9 文章 :: 421 評(píng)論 :: 0 Trackbacks
    key words:hibernate,復(fù)合主鍵,composite-id



    基于業(yè)務(wù)需求,您會(huì)需要使用兩個(gè)字段來(lái)作復(fù)合主鍵,例如在User數(shù)據(jù)表中,您也許會(huì)使用"name""phone"兩個(gè)字段來(lái)定義復(fù)合主鍵。

    假設(shè)您這么建立User表格:

    CREATE?TABLE?user?(

    ????name?
    VARCHAR(100)?NOT?NULL,

    ????phone?
    VARCHAR(50)?NOT?NULL,

    ????age?
    INT,

    ????
    PRIMARY?KEY(name,?phone)

    );

    在表格中,"name""age"被定義為復(fù)合主鍵,在映像時(shí),您可以讓User類別直接帶有"name""age"這兩個(gè)屬性,而Hibernate要求復(fù)合主鍵類別要實(shí)作Serializable接口,并定義equals()hashCode()方法:

    User.java

    package?onlyfun.caterpillar;

    ?

    import?java.io.Serializable;

    import?org.apache.commons.lang.builder.EqualsBuilder;

    import?org.apache.commons.lang.builder.HashCodeBuilder;

    ?

    //?復(fù)合主鍵類的對(duì)應(yīng)類別必須實(shí)作Serializable接口

    public?class?User?implements?Serializable?{

    ????
    private?String?name;

    ????
    private?String?phone;

    ????
    private?Integer?age;

    ???

    ????
    public?User()?{

    ????}

    ?

    ????
    public?Integer?getAge()?{

    ????????
    return?age;

    ????}

    ?

    ????
    public?void?setAge(Integer?age)?{

    ????????
    this.age?=?age;

    ????}

    ?

    ????
    public?String?getName()?{

    ????????
    return?name;

    ????}

    ?

    ????
    public?void?setName(String?name)?{

    ????????
    this.name?=?name;

    ????}

    ?

    ????
    public?String?getPhone()?{

    ????????
    return?phone;

    ????}

    ?

    ????
    public?void?setPhone(String?phone)?{

    ????????
    this.phone?=?phone;

    ????}

    ???

    ????
    //?必須重新定義equals()與hashCode()

    ????
    public?boolean?equals(Object?obj)?{

    ????????
    if(obj?==?this)?{

    ????????????
    return?true;

    ????????}

    ???????

    ????????
    if(!(obj?instanceof?User))?{

    ????????????
    return?false;

    ????????}

    ???????

    ????????User?user?
    =?(User)?obj;

    ????????
    return?new?EqualsBuilder()

    ?????????????????.append(
    this.name,?user.getName())

    ?????????????????.append(
    this.phone,?user.getPhone())

    ?????????????????.isEquals();

    ???????

    ????}

    ???

    ????
    public?int?hashCode()?{

    ????????
    return?new?HashCodeBuilder()

    ?????????????????.append(
    this.name)

    ?????????????????.append(
    this.phone)

    ?????????????????.toHashCode();

    ????}

    }

    equals()hashCode()方法被用作兩筆不同數(shù)據(jù)的識(shí)別依據(jù);接著您可以使用<composite-id>在映射文件中定義復(fù)合主鍵與對(duì)象的屬性對(duì)應(yīng):

    User.hbm.xml

    <?xml?version="1.0"?encoding="utf-8"?>

    <!DOCTYPE?hibernate-mapping

    ????PUBLIC?"-//Hibernate/Hibernate?Mapping?DTD?3.0//EN"

    ????"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
    >

    ?

    <hibernate-mapping>

    ?

    ????
    <class?name="onlyfun.caterpillar.User"?table="user">

    ????????
    <composite-id>

    ????????????
    <key-property?name="name"

    ??????????????????????????column
    ="name"

    ??????????????????????????type
    ="java.lang.String"/>

    ????????????
    <key-property?name="phone"

    ??????????????????????????column
    ="phone"

    ??????????????????????????type
    ="java.lang.String"/>

    ????????
    </composite-id>

    ?

    ????????
    <property?name="age"?column="age"?type="java.lang.Integer"/>

    ???

    ????
    </class>

    </hibernate-mapping>

    在儲(chǔ)存數(shù)據(jù)方面,復(fù)合主鍵的儲(chǔ)存沒什么區(qū)別,現(xiàn)在的問題在于如何依據(jù)復(fù)合主鍵來(lái)查詢數(shù)據(jù),例如使用load()方法,您可以創(chuàng)建一個(gè)User實(shí)例,并設(shè)定復(fù)合主鍵對(duì)應(yīng)的屬性,接著再透過load()查詢對(duì)應(yīng)的數(shù)據(jù),例如:

    User?user?=?new?User();

    user.setName(
    "bush");

    user.setPhone(
    "0970123456");

    ???????

    Session?session?
    =?sessionFactory.openSession();

    //?以實(shí)例設(shè)定復(fù)合主鍵并加載對(duì)應(yīng)的數(shù)據(jù)

    user?
    =?(User)?session.load(User.class,?user);

    ???????

    System.out.println(user.getAge()?
    +?"\t"?+

    ??????????????????????????????????user.getName()?
    +?"\t"?+

    ??????????????????????????????????user.getPhone());

    session.close();

    ?

    ?

    可以將主鍵的信息獨(dú)立為一個(gè)類別,例如:

    UserPK.java

    package?onlyfun.caterpillar;

    ?

    import?java.io.Serializable;

    ?

    import?org.apache.commons.lang.builder.EqualsBuilder;

    import?org.apache.commons.lang.builder.HashCodeBuilder;

    ?

    public?class?UserPK?implements?Serializable?{

    ????
    private?String?name;

    ????
    private?String?phone;

    ?

    ????
    public?String?getName()?{

    ????????
    return?name;

    ????}

    ?

    ????
    public?void?setName(String?name)?{

    ????????
    this.name?=?name;

    ????}

    ?

    ????
    public?String?getPhone()?{

    ????????
    return?phone;

    ????}

    ?

    ????
    public?void?setPhone(String?phone)?{

    ????????
    this.phone?=?phone;

    ????}

    ???

    ????
    public?boolean?equals(Object?obj)?{

    ????????
    if(obj?==?this)?{

    ????????????
    return?true;

    ????????}

    ???????

    ????????
    if(!(obj?instanceof?User))?{

    ????????????
    return?false;

    ????????}

    ???????

    ????????UserPK?pk?
    =?(UserPK)?obj;

    ????????
    return?new?EqualsBuilder()

    ?????????????????.append(
    this.name,?pk.getName())

    ?????????????????.append(
    this.phone,?pk.getPhone())

    ?????????????????.isEquals();

    ???????

    ????}

    ???

    ????
    public?int?hashCode()?{

    ????????
    return?new?HashCodeBuilder()

    ?????????????????.append(
    this.name)

    ?????????????????.append(
    this.phone)

    ?????????????????.toHashCode();

    ????}

    }

    現(xiàn)在User類別的主鍵信息被分離出來(lái)了,例如:

    User.java

    package?onlyfun.caterpillar;

    ?

    import?java.io.Serializable;

    ?

    public?class?User?implements?Serializable?{

    ????
    private?UserPK?userPK;?//?主鍵

    ????
    private?Integer?age;

    ???

    ????
    public?User()?{

    ????}

    ?

    ????
    public?UserPK?getUserPK()?{

    ????????
    return?userPK;

    ????}

    ?

    ????
    public?void?setUserPK(UserPK?userPK)?{

    ????????
    this.userPK?=?userPK;

    ????}

    ?

    ????
    public?Integer?getAge()?{

    ????????
    return?age;

    ????}

    ?

    ????
    public?void?setAge(Integer?age)?{

    ????????
    this.age?=?age;

    ????}

    }

    在映像文件方面,需要指定主鍵類的信息,例如:

    User.hbm.xml

    <?xml?version="1.0"?encoding="utf-8"?>

    <!DOCTYPE?hibernate-mapping

    ????PUBLIC?"-//Hibernate/Hibernate?Mapping?DTD?3.0//EN"

    ????"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
    >

    ?

    <hibernate-mapping>

    ?

    ????
    <class?name="onlyfun.caterpillar.User"?table="user">

    ????????
    <composite-id?name="userPK"

    ??????????????????????class
    ="onlyfun.caterpillar.UserPK"

    ??????????????????????unsaved-value
    ="any">

    ????????????
    <key-property?name="name"

    ??????????????????????????column
    ="name"

    ??????????????????????????type
    ="java.lang.String"/>

    ????????????
    <key-property?name="phone"

    ??????????????????????????column
    ="phone"

    ??????????????????????????type
    ="java.lang.String"/>

    ????????
    </composite-id>

    ???????

    ????????
    <property?name="age"?column="age"?type="java.lang.Integer"/>

    ???

    ????
    </class>

    ?

    </hibernate-mapping>

    在查詢數(shù)據(jù)時(shí),必須指定主鍵信息,例如:

    UserPK?pk?=?new?UserPK();

    pk.setName(
    "bush");

    pk.setPhone(
    "0970123456");

    ??????

    Session?session?
    =?sessionFactory.openSession();

    //?以主鍵類實(shí)例設(shè)定復(fù)合主鍵并加載對(duì)應(yīng)的數(shù)據(jù)

    User?user?
    =?(User)?session.load(User.class,?pk);

    ??????

    System.out.println(user.getAge()?
    +?"\t"?+

    ??????????????????????????????????user.getUserPK().getName()?
    +?"\t"?+

    ??????????????????????????????????user.getUserPK().getPhone());

    session.close();

    ?


    =================================================
    再參考robbin的一篇文章
    一個(gè)簡(jiǎn)單的復(fù)合主鍵的做關(guān)聯(lián)類的例子??
    posted on 2006-11-09 19:22 Alex 閱讀(12924) 評(píng)論(5)  編輯  收藏 所屬分類: Hibernate

    評(píng)論

    # re: [zt]hibernate復(fù)合主鍵 2009-05-27 21:38 lmzh-scut
    could not initialize proxy - no Session
    何解?  回復(fù)  更多評(píng)論
      

    # re: [zt]hibernate復(fù)合主鍵 2009-08-13 17:15 溫薔薇
    我暈····················很簡(jiǎn)單的問題把它復(fù)雜化了·  回復(fù)  更多評(píng)論
      

    # re: [zt]hibernate復(fù)合主鍵 2009-09-18 13:41 sunning
    明白了。謝謝  回復(fù)  更多評(píng)論
      

    # re: [zt]hibernate復(fù)合主鍵 2014-05-19 20:09 cvx
    cxcxc  回復(fù)  更多評(píng)論
      

    # re: [zt]hibernate復(fù)合主鍵 2014-05-19 20:09 hfiusdfhsudifhsidua
    dsd  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 国产在线精品免费aaa片| 一级毛片高清免费播放| 国产精品永久免费10000| 亚洲精选在线观看| 日韩av无码久久精品免费 | 四虎影视大全免费入口| 亚洲国产激情在线一区| 欧美a级在线现免费观看| 亚洲AV日韩综合一区尤物| 欧美好看的免费电影在线观看| wwwxxx亚洲| 日本免费福利视频| 国产亚洲高清在线精品不卡| 亚洲人成网站观看在线播放| 72pao国产成视频永久免费| 亚洲春色在线视频| 91短视频在线免费观看| 中文字幕无码精品亚洲资源网久久 | 亚洲国产精品综合久久20| 免费爱爱的视频太爽了| 免费人妻精品一区二区三区| 亚洲国产婷婷香蕉久久久久久 | 最近中文字幕mv免费高清视频8| 亚洲春色在线观看| 国产美女无遮挡免费视频网站| 无码毛片一区二区三区视频免费播放 | 日本不卡视频免费| 国产精品无码永久免费888| 亚洲视频一区调教| 成人看的午夜免费毛片| 久久性生大片免费观看性| 久久久久亚洲av无码专区导航| 免费在线观看的网站| 一进一出60分钟免费视频| 久久久久亚洲精品天堂| 国产高清在线精品免费软件| 三上悠亚电影全集免费| 亚洲熟妇无码AV| 亚洲精品无码国产| 四虎影院免费视频| 久久国产乱子免费精品|