和風細雨

          世上本無難事,心以為難,斯乃真難。茍不存一難之見于心,則運用之術自出。

          多對多關系的Hibernate映射

          多對多關系一般指兩個類都擁有對方集合的成員變量,比如說文章類Article和標簽類Tag,一個Arirtle類可以擁有多個Tag,一個Tag也適用于多篇文章,它們的類圖如下:



          它們也分別對應數據庫中的實體表Articles和Tags,當然僅靠這兩個表實現多對多能力是有限的,我們還需要第三個表ArticleTag的幫忙,它們的ER圖如下:


          實際上多對多關系并不復雜,加入一個中間表問題就迎刃而解,這和在耦合強烈的兩個類之間加入一個中間類以降低耦合的思維是一致的.

          下面的代碼演示了如何將兩個類和數據庫映射起來:
          Article類:
          package com.sitinspring.articletag;

          import java.util.HashSet;
          import java.util.Set;

          public class Article{
              
          private long id;
              
          private String name;
              
              
          private Set<Tag> tags = new HashSet<Tag>();
              
              
          public Article(){
                  
              }

              
              
          public Article(long id,String name){
                  
          this.id=id;
                  
          this.name=name;
              }

              
              
          public String toString(){
                  String retval
          ="Article name="+name;
                  
                  
          for(Tag tag:tags){
                      retval
          +="\n"+tag;
                  }

                  
                  
          return retval;
              }


              
          public long getId() {
                  
          return id;
              }


              
          public void setId(long id) {
                  
          this.id = id;
              }


              
          public String getName() {
                  
          return name;
              }


              
          public void setName(String name) {
                  
          this.name = name;
              }


              
          public Set getTags() {
                  
          return tags;
              }


              
          public void setTags(Set tags) {
                  
          this.tags = tags;
              }

          }

          Article.hbm.xml:
          <?xml version="1.0"?>
          <!DOCTYPE hibernate-mapping PUBLIC 
              "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
              "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
          >
          <hibernate-mapping package="org.hibernate.auction">
              
          <class name="com.sitinspring.articletag.Article" table="ARTICLE">
                  
          <id name="id" column="ARTICLEID" />
                  
          <property name="name" column="NAME" />

                  
          <set name="tags" table="ARTICLETAG"  cascade="all" lazy="false">
                      
          <key column="ARTICLEID" />
                      
          <many-to-many column="TAGID" class="com.sitinspring.articletag.Tag" />
                  
          </set>
              
          </class>
          </hibernate-mapping>

          Tag類:
          package com.sitinspring.articletag;

          import java.util.HashSet;
          import java.util.Set;

          public class Tag{
              
          private long id;
              
          private String name;
              
              
          private Set articles = new HashSet();
              
              
          public Tag(){        
              }

              
              
          public String toString(){
                  
          return "Tag name="+name;
              }

              
              
          public Tag(long id,String name){
                  
          this.id=id;
                  
          this.name=name;
              }


              
          public long getId() {
                  
          return id;
              }


              
          public void setId(long id) {
                  
          this.id = id;
              }


              
          public java.lang.String getName() {
                  
          return name;
              }


              
          public void setName(java.lang.String name) {
                  
          this.name = name;
              }


              
          public Set getArticles() {
                  
          return articles;
              }


              
          public void setArticles(Set articles) {
                  
          this.articles = articles;
              }

          }

          Tag.hbm.xml:
          <?xml version="1.0"?>
          <!DOCTYPE hibernate-mapping PUBLIC 
              "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
              "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
          >
          <hibernate-mapping package="org.hibernate.auction">
              
          <class name="com.sitinspring.articletag.Tag" table="TAG">
                  
          <id name="id" column="TAGID" />
                  
          <property name="name"  column="NAME" />
                  
                  
          <set name="articles" table="ARTICLETAG" cascade="all" lazy="false">
                      
          <key column="TAGID" />
                      
          <many-to-many column="ARTICLEID" class="com.sitinspring.articletag.Article" />
                  
          </set>
              
          </class>
          </hibernate-mapping>

          測試代碼:
          package com.sitinspring.articletag;

          import java.util.HashSet;
          import java.util.Set;

          import org.hibernate.Session;

          import com.sitinspring.util.HibernateUtil;

          public class Main {
              
          public static void main(String[] args) {
                  Session session 
          = HibernateUtil.getSessionFactory().getCurrentSession();
                  session.beginTransaction();

                  
          // --插入代碼開始
                  Article article = new Article(1"論語學而");

                  Set tags 
          = new HashSet();
                  Tag tag1 
          = new Tag(8"軍事");
                  tags.add(tag1);

                  Tag tag2 
          = new Tag(9"政治");
                  tags.add(tag2);

                  article.setTags(tags);

                  session.save(article);
                  
          // --插入代碼結束

                  
          // --讀取代碼開始
                  long i = 1;

                  Article articleLoaded 
          = (Article) session.load(Article.class, i);
                  System.out.println(articleLoaded);
                  
          // --讀取代碼開始

                  session.getTransaction().commit();
                  HibernateUtil.getSessionFactory().close();
              }

          }

          測試結果如下:






          代碼下載:
          http://www.aygfsteel.com/Files/sitinspring/HibernateClasses20071109085612.rar

          posted on 2008-02-22 11:23 和風細雨 閱讀(223) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 东兰县| 昌宁县| 湟源县| 宿州市| 垣曲县| 九龙坡区| 上犹县| 时尚| 凌海市| 叙永县| 辽中县| 桂东县| 泸西县| 石柱| 西乌珠穆沁旗| 肃宁县| 淳安县| 沁阳市| 雷州市| 河池市| 巧家县| 汕头市| 华宁县| 安岳县| 自贡市| 九江市| 赣榆县| 文成县| 和平区| 白银市| 建水县| 高要市| 来安县| 青海省| 邹城市| 纳雍县| 手机| 鸡西市| 金溪县| 英德市| 和田市|