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)

          朋友的博客

          電子資料

          搜索

          •  

          積分與排名

          • 積分 - 302711
          • 排名 - 192

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 武山县| 桂阳县| 清苑县| 海原县| 丰城市| 南澳县| 信丰县| 溧水县| 视频| 呼图壁县| 高陵县| 渭南市| 惠州市| 定陶县| 多伦县| 南乐县| 盐津县| 高清| 鹤峰县| 金湖县| 剑阁县| 德惠市| 会理县| 乌苏市| 海安县| 湄潭县| 广南县| 博客| 沽源县| 蚌埠市| 开封县| 海盐县| 延津县| 莆田市| 平潭县| 肃宁县| 酒泉市| 封开县| 东乡县| 滨海县| 阿克苏市|