posts - 0, comments - 77, trackbacks - 0, articles - 356
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          EJB學(xué)習(xí)日記(10)

          Posted on 2007-09-27 14:24 semovy 閱讀(199) 評論(0)  編輯  收藏 所屬分類: EJB
          實體BEAN的七種關(guān)系之---------一對多單向
           One-to-Many Unidirectional Relationship

          一對多單向最典型的應(yīng)用莫過于人和電話的關(guān)系了,我們一個人可以有很多個電話,有時候還經(jīng)常會換號碼,我們可以既有小靈通也有手機(jī),家里還有固定電話,這就是很典型的一對多關(guān)系,為什么要是單向的呢,因為電話的易變性,這個號碼可能今天是你的,明天就可能是別人的了,并且現(xiàn)在買手機(jī)號碼是不需要身份證的,所以從電話號碼是不可能查到你的身份證了.并且電話號碼也不應(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)系的維護(hù)端都是在多的那一方,也就是Phone那里,因為要在數(shù)據(jù)庫面表現(xiàn)的話,也只有讓Phone起一個指向Person的外鍵,不可能在Person里面指向Phone,這一點(diǎn)和一對一不一樣,一對一可以在任意一方起一個外鍵指向?qū)Ψ?可是一對多卻不行了.在這里@JoinColumn這個注釋指的卻是在Phone里面的外鍵的列的名字,它并不像在一對一里面的注釋指的是自己表里面的外鍵列名.這一點(diǎn)要特別注意一下.
          如果是一對多的雙向關(guān)系,那么這個注釋就要應(yīng)用到多的那邊去了,雖然注釋還在Person類里面,但是它起的效果卻是在Phone里面起一個叫personID的外鍵, 因為多的那邊要有外鍵指向少的這邊.

          如果你不加    @JoinColumn(name="personID")這個注釋的話,那么JBOSS就會自動幫你生成一張中間表,它負(fù)現(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)系。
          主站蜘蛛池模板: 确山县| 分宜县| 台东市| 大关县| 屯昌县| 富宁县| 宜都市| 惠来县| 千阳县| 浠水县| 纳雍县| 沈丘县| 嘉荫县| 民丰县| 海口市| 绥化市| 察隅县| 金华市| 三门县| 盐源县| 集贤县| 景泰县| 盐城市| 华亭县| 和林格尔县| 花莲县| 乌拉特前旗| 望城县| 徐闻县| 墨玉县| 鄂托克前旗| 舞阳县| 武隆县| 曲靖市| 墨竹工卡县| 工布江达县| 宾川县| 汉川市| 正定县| 曲靖市| 霞浦县|