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

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

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

    posts - 40,  comments - 187,  trackbacks - 0

    說明
    ??????? 在HibernateAnnotations中通過@ManyToMany注解可定義多對多關聯。同時,也需要通過注解@JoinTable描述關聯表和關聯條件。對于雙向關聯,其中一端必須定義為owner,另一端必須定義為inverse(在對關聯表進行更性操作時這一端將被忽略)。被關聯端不必也不能描述物理映射,只需要一個簡單的mappedBy參數,該參數包含了主體端的屬性名,這樣就綁定了雙方的關系。

    ??????上周六去電影院圓了兒時的夢想,看了變形金剛,超棒的一部片子 ^_^。那么就以劇院和觀眾為例講解吧。

    如何制作PO

    1)找到CUBE--需要引入哪些類:

    import ?java.util.ArrayList;
    import ?java.util.List;
    import ?javax.persistence.CascadeType;
    import ?javax.persistence.Entity;
    import ?javax.persistence.FetchType;
    import ?javax.persistence.JoinColumn;
    import ?javax.persistence.JoinTable;
    import ?javax.persistence.ManyToMany;
    import ?javax.persistence.Table;
    import ?org.hibernate.annotations.Cache;
    import ?org.hibernate.annotations.CacheConcurrencyStrategy;

    2)找到汽車人--主體端:
    /**
    ?*?Theater
    ?*?
    @author?allen
    ?
    */

    @SuppressWarnings(
    "serial")
    @Entity
    @Table(name?
    =?"THEATER")
    @Cache(usage?
    =?CacheConcurrencyStrategy.READ_WRITE)
    public?class?Theater?implements?Serializable?{
    ????
    ????@ManyToMany(
    ????????????targetEntity
    =net.allen.domain.Audience.class,
    ????????????cascade?
    ={CascadeType.PERSIST,CascadeType.MERGE},
    ????????????fetch
    =FetchType.LAZY
    ????)
    ????@JoinTable(
    ????????????name
    ="THEATER_AUDIENCE",
    ????????????joinColumns
    ={@JoinColumn(name="THEATER_ID")},
    ????????????inverseJoinColumns
    ={@JoinColumn(name="AUDIENCE_ID")}
    ????)
    ????@Cache(usage?
    =?CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    ????
    private?List<Audience>?audiences?=?new?ArrayList<Audience>();

    ????
    /**
    ?????*?
    @return?Returns?the?audiences.
    ?????
    */

    ????
    public?List<Audience>?getAudiences()?{
    ????????
    return?audiences;
    ????}


    ????
    /**
    ?????*?
    @param?audiences?The?audiences?to?set.
    ?????
    */

    ????
    public?void?setAudiences(List<Audience>?audiences)?{
    ????????
    this.audiences?=?audiences;
    ????}
    ????
    }

    功能說明:
    @ManyToMany注解
    ???? targetEntity屬性:指向被關聯端的實體對象
    ???? cascade屬性:與Hibernate xml配置文件中的意思一樣,這里選用兩種方式
    ????????????CascadeType.PERSIST:若實體是處于被管理狀態,或當persist()方法被調用時,觸發級聯創建(create)操作。???
    ????????????CascadeType.MERGE:若實體是處于被管理狀態,或當merge)方法被調用時,觸發級聯合并(merge)操作。
    ?????????????其它屬性如CascadeType.REMOVE、CascadeType.REFRESH、CascadeType.ALL等屬性可參考Hibernate Annotations Reference。
    ???? fetch屬性:關聯關系獲取方式
    ?????????????? LAZY(默認值)在第一次訪問關聯對象時才觸發相應的查詢操作。
    ?????????????? 另一個值EAGER是通過out join select直接獲取關聯對象
    ????
    @JoinTable注解
    ???? name屬性:指定關聯表名 若不指定Hibernate可以根據既定的規則自動生成(具體規則見reference)
    ???? joinColumns屬性:指定主體端的外鍵
    ???? inverseJoinColumns屬性:指定被關聯端的外鍵

    @Cache注解
    ???? usage屬性:給定了緩存的并發策略


    3)找到霸天虎--被關聯端:

    /**
    ?*?Audience
    ?*?
    @author?allen
    ?
    */


    @SuppressWarnings(
    "serial")
    @Entity
    @Table(name?
    =?"AUDIENCE")
    @Cache(usage?
    =?CacheConcurrencyStrategy.READ_WRITE)
    public?class?Audience?implements?Serializable?{
    ????
    ????@ManyToMany(
    ???????????cascade
    ={CascadeType.PERSIST,CascadeType.MERGE},
    ???????????mappedBy
    ="audiences"
    ????)
    ????
    /**?所在的劇院?*/
    ????
    private?List<Theater>?theaters?=?new?ArrayList<Theater>();

    ????
    /**
    ?????*?
    @return?Returns?the?theaters.
    ?????
    */

    ????
    public?List<Theater>?getTheaters()?{
    ????????
    return?theaters;
    ????}


    ????
    /**
    ?????*?
    @param?theaters?The?theaters?to?set.
    ?????
    */

    ????
    public?void?setTheaters(List<Theater>?theaters)?{
    ????????
    this.theaters?=?theaters;
    ????}

    }
    功能說明:
    @ManyToMany注解
    ???? mappedBy屬性:指定了主體端的屬性名,用以綁定雙方的關系???


    汽車人,變形!--如何操作
    /**
    ?????*?select?transformers?wathers?from?ShowMax?Theater
    ?????
    */

    ????
    protected?void?selectWathers()?{
    ????????
    //1)?get?current?theater
    ????????Theater?theater?=?findTheaterById("showMax");
    ????????
    //2)?clear?theater's?audiences
    ????????theater.getAudiences().clear();
    ????????
    //3)?get?audiences?who?want?to?watch?transformers
    ????????List<Audience>?audiences?=?findAudiencesByMovie("transformers");
    ????????
    for?(Audience?a:?audiences)?{
    ????????????
    //4)?mountain?relations
    ????????????a.getTheaters().add(theater);
    ????????????theater.getAudiences().add(a);
    ????????}

    ????????
    //5)?do?save?main?entity
    ????????doSaveEntity(theater);
    ????}

    tips:注意第二步的操作。

    好了,大功告成!說回電影,紅蜘蛛這小子跑得還挺快,期待續集!


    PS:找到一份中文的hiberante?annotations reference,與大家共享。點擊下載


    ??????????????????????????????????????????????????????????????????????????????THE END
    ????????????????

    posted on 2007-08-02 15:19 小立飛刀 閱讀(14598) 評論(8)  編輯  收藏 所屬分類: Hibernate

    FeedBack:
    # re: 使用Hibernate Annotations 維護多對多關系的心得
    2007-08-03 13:10 | 中東
    寫的很好,關于多對多關系,轉換為二個一對多關,有什么看法?  回復  更多評論
      
    # re: 使用Hibernate Annotations 維護多對多關系的心得
    2007-08-03 13:13 | 中東
    為什么在主從方都定義了“cascade={CascadeType.PERSIST,CascadeType.MERGE}”??有什么不同嗎?在從方可以不定義嗎?  回復  更多評論
      
    # re: 使用Hibernate Annotations 維護多對多關系的心得
    2007-08-14 17:11 | 小雪飛刀
    @中東
    因為是多對多的關系,所以雙方都要定義。
    另外多對一時,主從方也都需要設置cascade屬性,舉個例子:

    主控方:Business
    @ManyToOne(cascade ={CascadeType.PERSIST,CascadeType.MERGE})
    /** 對應的流程模板 */
    private BusinessFlow flow;

    受控方:BusinessFlow
    @OneToMany(mappedBy="flow",cascade ={CascadeType.ALL},fetch=FetchType.LAZY)
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    /** 業務流程可以應用于的業務列表 */
    private List<Business> business = new ArrayList<Business>();

    當在Business類中配置成cascade = { CascadeType.PERSIST, CascadeType.MERGE } 時,更新和刪除兩個級聯時,可以正常刪除;
    當在Business類中配置成cascade = { CascadeType.ALL } or cascade={} 時,無法刪除。
    更新時也類似于這種情況。

    關于以上所說,您可以親自試驗一下,看看其中的區別。然后請您告訴我實驗結果。:)
    畢竟是“實踐出真知”嘛!  回復  更多評論
      
    # re: 使用Hibernate Annotations 維護多對多關系的心得
    2007-10-26 10:39 | 中華信鴿
    學習了。  回復  更多評論
      
    # re: 使用Hibernate Annotations 維護多對多關系的心得[未登錄]
    2009-02-12 13:27 | kevin
    不錯~學習了~  回復  更多評論
      
    # re: 使用Hibernate Annotations 維護多對多關系的心得
    2009-07-01 18:05 | 11
    good thank you!  回復  更多評論
      
    # re: 使用Hibernate Annotations 維護多對多關系的心得
    2009-09-17 16:12 | popoer
    寫得很清楚,謝謝!  回復  更多評論
      
    # re: 使用Hibernate Annotations 維護多對多關系的心得[未登錄]
    2013-11-11 10:28 | jack
    學習了  回復  更多評論
      
    <2007年8月>
    2930311234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    生存或毀滅,這是個必答之問題:是否應默默的忍受坎苛命運之無情打擊,還是應與深如大海之無涯苦難奮然為敵,并將其克服。此二抉擇,究竟是哪個較崇高?

    常用鏈接

    留言簿(12)

    隨筆分類(43)

    相冊

    收藏夾(7)

    朋友的博客

    電子資料

    搜索

    •  

    積分與排名

    • 積分 - 302650
    • 排名 - 192

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 无码中文字幕av免费放dvd| 国产精品免费看久久久香蕉| 2019中文字幕在线电影免费| 国产成人A人亚洲精品无码| a国产成人免费视频| 久久亚洲精品成人| 久久精品免费视频观看| 亚洲一二成人精品区| 亚洲免费一级视频| 亚洲最大的成人网| 国产高清在线免费视频| 青青草97国产精品免费观看| 国产黄色一级毛片亚洲黄片大全| 全黄大全大色全免费大片| 亚洲Av综合色区无码专区桃色| 亚洲免费在线播放| 中文有码亚洲制服av片| 免费国产在线观看不卡| 9久热精品免费观看视频| 亚洲黄网在线观看| 妞干网手机免费视频| 又硬又粗又长又爽免费看 | 免费看黄视频网站| 日韩欧美亚洲中文乱码| 亚洲色婷婷综合开心网| 免费A级毛片av无码| 亚洲精品天堂无码中文字幕| 日韩精品亚洲aⅴ在线影院| 免费看h片的网站| 爱情岛亚洲论坛在线观看 | 区久久AAA片69亚洲| 13一14周岁毛片免费| 亚洲heyzo专区无码综合| 久久精品国产亚洲Aⅴ蜜臀色欲| 国产成人久久AV免费| 亚洲欧洲无码AV不卡在线| 亚洲va中文字幕无码久久不卡| 一二三四免费观看在线视频中文版| 看全免费的一级毛片| 亚洲综合免费视频| 亚洲国产精品一区二区九九|