<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,快速開(kāi)發(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類(lèi)別直接帶有"name""age"這兩個(gè)屬性,而Hibernate要求復(fù)合主鍵類(lèi)別要實(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ù)合主鍵類(lèi)的對(duì)應(yīng)類(lèi)別必須實(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ǔ)存沒(méi)什么區(qū)別,現(xiàn)在的問(wèn)題在于如何依據(jù)復(fù)合主鍵來(lái)查詢(xún)數(shù)據(jù),例如使用load()方法,您可以創(chuàng)建一個(gè)User實(shí)例,并設(shè)定復(fù)合主鍵對(duì)應(yīng)的屬性,接著再透過(guò)load()查詢(xún)對(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è)類(lèi)別,例如:

    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)別的主鍵信息被分離出來(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;

    ????}

    }

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

    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>

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

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

    pk.setName(
    "bush");

    pk.setPhone(
    "0970123456");

    ??????

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

    //?以主鍵類(lèi)實(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)類(lèi)的例子??
    posted on 2006-11-09 19:22 Alex 閱讀(12923) 評(píng)論(5)  編輯  收藏 所屬分類(lèi): 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)單的問(wè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)論
      

    主站蜘蛛池模板: 国产精品99久久免费观看| 国产成人精品久久亚洲高清不卡| av午夜福利一片免费看久久| 免费看美女让人桶尿口| 亚洲中文字幕久久精品无码VA | 亚洲一区影音先锋色资源| 在线观看免费视频网站色| 亚洲一区二区三区无码中文字幕 | 成人影片一区免费观看| 亚洲人成人一区二区三区| 中国好声音第二季免费播放| 国产亚洲免费的视频看 | **aaaaa毛片免费同男同女| 久久精品国产免费| 国产亚洲人成网站观看| 久久精品国产这里是免费| 97se亚洲综合在线| 免费无码又爽又刺激聊天APP| 亚洲熟伦熟女专区hd高清| 国产免费资源高清小视频在线观看| 春暖花开亚洲性无区一区二区| 亚洲国产人成中文幕一级二级| 黄床大片免费30分钟国产精品| 亚洲Aⅴ无码专区在线观看q| 国内精自视频品线六区免费 | 59pao成国产成视频永久免费| 亚洲乱码在线视频| 国产视频精品免费| 中文日本免费高清| 亚洲精品不卡视频| 国产成人无码a区在线观看视频免费 | 免费在线观看的网站| 免费的黄色网页在线免费观看| 亚洲欧洲成人精品香蕉网| 免费观看无遮挡www的视频 | 国产亚洲欧洲精品| 国产福利在线观看免费第一福利| 亚洲人成图片小说网站| 亚洲一级毛片免费在线观看| 日韩色日韩视频亚洲网站| 亚洲成Av人片乱码色午夜|