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

          EJB學習日記(10)

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

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

          首先我們還是先要定義一個人的實體類
          /*
           * 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類里面發現如下注釋

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


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

          如果你不加    @JoinColumn(name="personID")這個注釋的話,那么JBOSS就會自動幫你生成一張中間表,它負現Person和Phone表之間的聯系.它將會做如下事情:
          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);

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

          所以一對多的單向關聯,我們還是推薦使用一張中間表來建立關系。
          主站蜘蛛池模板: 庐江县| 怀柔区| 浮山县| 沅江市| 昌图县| 大悟县| 沙田区| 宝坻区| 彰化县| 香河县| 芷江| 中宁县| 恩平市| 富锦市| 民乐县| 华蓥市| 嘉禾县| 托里县| 泌阳县| 青海省| 平阳县| 大足县| 芷江| 怀来县| 博兴县| 襄樊市| 景洪市| 通道| 杭锦旗| 汝城县| 老河口市| 麻江县| 邻水| 固始县| 界首市| 龙川县| 南汇区| 黑龙江省| 桐柏县| 启东市| 满城县|