千里冰封
          JAVA 濃香四溢
          posts - 151,comments - 2801,trackbacks - 0
          實體BEAN的七種關(guān)系之---------一對多單向
           One-to-Many Unidirectional Relationship

          一對多單向最典型的應(yīng)用莫過于人和電話的關(guān)系了,我們一個人可以有很多個電話,有時候還經(jīng)常會換號碼,我們可以既有小靈通也有手機,家里還有固定電話,這就是很典型的一對多關(guān)系,為什么要是單向的呢,因為電話的易變性,這個號碼可能今天是你的,明天就可能是別人的了,并且現(xiàn)在買手機號碼是不需要身份證的,所以從電話號碼是不可能查到你的身份證了.并且電話號碼也不應(yīng)該和人綁定,一般我們都是問別人電話是多少,卻比較少去問一個號碼是誰的(這種情況也有,就是你收到陌生人的電話或短信的時候).那我們還是先看代碼吧.

          首先我們還是先要定義一個人的實體類
          /*
           * Person.java
           * 
           * Created on 2007-9-15, 0:11:58
           * 
           * To change this template, choose Tools | Templates
           * and open the template in the editor.
           
          */

          package lbf.entitybean.test1;

          import java.io.Serializable;
          import java.util.List;
          import javax.persistence.CascadeType;
          import javax.persistence.Entity;
          import javax.persistence.GeneratedValue;
          import javax.persistence.GenerationType;
          import javax.persistence.Id;
          import javax.persistence.JoinColumn;
          import javax.persistence.OneToMany;
          import javax.persistence.OneToOne;

          /**
           *
           * 
          @author Admin
           
          */
          @Entity
          public class Person implements Serializable {
              
          private IDCard idCard;
              
          private static final long serialVersionUID = 1L;
              
          private Long id;
              
          private String name;
              
          private String sex;
              
          private int age;
              
          private Address address;
              
              @OneToOne(cascade
          =CascadeType.ALL,optional=true)
              
          public Address getAddress() {
                  
          return address;
              }

              
          public void setAddress(Address address) {
                  
          this.address = address;
              }
              @OneToMany(cascade
          =CascadeType.ALL)
              @JoinColumn(name
          ="personID")
              
          public List<Phone> getPhones() {
                  
          return phones;
              }

              
          public void setPhones(List<Phone> phones) {
                  
          this.phones = phones;
              }
              
          private List<Phone> phones;
              
          public int getAge() {
                  
          return age;
              }

              
          public void setAge(int age) {
                  
          this.age = age;
              }

              
          public String getName() {
                  
          return name;
              }

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

              
          public String getSex() {
                  
          return sex;
              }

              
          public void setSex(String sex) {
                  
          this.sex = sex;
              }
              
          public void setId(Long id) {
                  
          this.id = id;
              }

              @Id
              @GeneratedValue(strategy 
          = GenerationType.AUTO)
              
          public Long getId() {
                  
          return id;
              }

              @OneToOne(cascade
          ={CascadeType.ALL})
              
          public IDCard getIdCard() {
                  
          return idCard;
              }

              
          public void setIdCard(IDCard iDCard) {
                  
          this.idCard = iDCard;
              }


          }


          然后是電話的實體類

          /*
           * Phone.java
           * 
           * Created on 2007-9-18, 17:23:28
           * 
           * To change this template, choose Tools | Templates
           * and open the template in the editor.
           
          */

          package lbf.entitybean.test1;

          import java.io.Serializable;
          import javax.persistence.CascadeType;
          import javax.persistence.Entity;
          import javax.persistence.GeneratedValue;
          import javax.persistence.GenerationType;
          import javax.persistence.Id;
          import javax.persistence.ManyToOne;

          /**
           *
           * 
          @author hadeslee
           
          */
          @Entity
          public class Phone implements Serializable {
              
          private static final long serialVersionUID = 1L;
              
          private Long id;
              
          private String phoneNumber;

              
          public String getPhoneNumber() {
                  
          return phoneNumber;
              }

              
          public void setPhoneNumber(String phoneNumber) {
                  
          this.phoneNumber = phoneNumber;
              }
              
          public void setId(Long id) {
                  
          this.id = id;
              }

              @Id
              @GeneratedValue(strategy 
          = GenerationType.AUTO)
              
          public Long getId() {
                  
          return id;
              }

          }

          我們可以在Person類里面發(fā)現(xiàn)如下注釋

           @OneToMany(cascade=CascadeType.ALL)
              @JoinColumn(name="personID")
              public List<Phone> getPhones() {
                  return phones;
              }


          它代表是一對多,一是指類本身,多是指這個成員,也就是一個類可以對應(yīng)多個成員.
          在一對多里面,無論是單向還是雙向,映射關(guān)系的維護端都是在多的那一方,也就是Phone那里,因為要在數(shù)據(jù)庫面表現(xiàn)的話,也只有讓Phone起一個指向Person的外鍵,不可能在Person里面指向Phone,這一點和一對一不一樣,一對一可以在任意一方起一個外鍵指向?qū)Ψ?可是一對多卻不行了.在這里@JoinColumn這個注釋指的卻是在Phone里面的外鍵的列的名字,它并不像在一對一里面的注釋指的是自己表里面的外鍵列名.這一點要特別注意一下.
          如果是一對多的雙向關(guān)系,那么這個注釋就要應(yīng)用到多的那邊去了,雖然注釋還在Person類里面,但是它起的效果卻是在Phone里面起一個叫personID的外鍵, 因為多的那邊要有外鍵指向少的這邊.

          如果你不加    @JoinColumn(name="personID")這個注釋的話,那么JBOSS就會自動幫你生成一張中間表,它負現(xiàn)Person和Phone表之間的聯(lián)系.它將會做如下事情:
          CREATE TABLE PERSON_PHONE
          (
              PERSON_id 
          INT,
           PHONE_id 
          INT
          );
          ALTER TABLE PERSON_PHONE ADD CONSTRAINT person_phone_unique
             
          UNIQUE (PHONE_id);

          ALTER TABLE PERSON_PHONE ADD CONSTRAINT personREFphone
             
          FOREIGN KEY (PERSON_id) REFERENCES PERSON (id);

          ALTER TABLE PERSON_PHONE ADD CONSTRAINT personREFphone2
             
          FOREIGN KEY (PHONE_id) REFERENCES PHONE (id);

          所以我們最好還是指定一下,以讓程序產(chǎn)生更加確定的行為,不過一般是推薦另外生成一個中間表好一些,因為這樣的話,對原來兩張表的結(jié)構(gòu)不對造成任何影響。在遺留系統(tǒng)的時候很多用,有些時候,一些表都是以前就建好了的,要改表的結(jié)構(gòu)是不太可能的,所以這個時候中間的表就顯得很重要了,它可以在不侵入原來表的情況下構(gòu)建出一種更清淅更易管理的關(guān)系。

          所以一對多的單向關(guān)聯(lián),我們還是推薦使用一張中間表來建立關(guān)系。



          盡管千里冰封
          依然擁有晴空

          你我共同品味JAVA的濃香.
          posted on 2007-09-20 08:53 千里冰封 閱讀(1121) 評論(0)  編輯  收藏 所屬分類: JAVAEE
          主站蜘蛛池模板: 大城县| 米脂县| 高台县| 江阴市| 西畴县| 金湖县| 临汾市| 阳信县| 明光市| 永康市| 长沙县| 隆林| 南靖县| 寻乌县| 宝丰县| 临高县| 郁南县| 郧西县| 崇明县| 望都县| 子长县| 泸定县| 长岛县| 金湖县| 泽普县| 延川县| 马山县| 梅河口市| 石家庄市| 正宁县| 如皋市| 鹿邑县| 来安县| 定日县| 滁州市| 苍梧县| 桂平市| 聂荣县| 礼泉县| 普洱| 永年县|