實體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);
所以我們最好還是指定一下,以讓程序產生更加確定的行為,不過一般是推薦另外生成一個中間表好一些,因為這樣的話,對原來兩張表的結構不對造成任何影響。在遺留系統的時候很多用,有些時候,一些表都是以前就建好了的,要改表的結構是不太可能的,所以這個時候中間的表就顯得很重要了,它可以在不侵入原來表的情況下構建出一種更清淅更易管理的關系。
所以一對多的單向關聯,我們還是推薦使用一張中間表來建立關系。
盡管千里冰封
依然擁有晴空
你我共同品味JAVA的濃香.
posted on 2007-09-20 08:53
千里冰封 閱讀(1117)
評論(0) 編輯 收藏 所屬分類:
JAVAEE