<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    千里冰封
    JAVA 濃香四溢
    posts - 151,comments - 2801,trackbacks - 0
    實體BEAN的七種關系之---------多對多雙向
    Many-to-Many Bidirectional Relationship

    一般來說,多對多的雙向發生在雙方都持有對方的很多引用,A可能持有很多個B,B也可能持有很多個A,并且A和B之間還要求能夠互相查詢.在現實中,我們可以用如下的例子來說明這種關系:

    人和航班,一個人可以訂很多次航班,可以是訂了今天的,也可以訂明天的,因為他工作繁忙,同樣的,一個航班不可能只為一個人而開,也可以接受很多個人的預訂.并且這種查詢是雙向的,一個人他可以查詢他訂了多少個航班,一個航班也可以查詢它被多少人訂了,這樣才好根據訂的情況進行安排.

    先看看代碼吧.

    還是老樣子,Person類的代碼
    /*
     * 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.JoinTable;
    import javax.persistence.ManyToMany;
    import javax.persistence.ManyToOne;
    import javax.persistence.OneToMany;
    import javax.persistence.OneToOne;

    /**
     *
     * 
    @author Admin
     
    */
    @Entity
    public class Person implements Serializable {

        
    private static final long serialVersionUID = 1L;
        
    private Long id;
        
    private String name;
        
    private String sex;
        
    private int age;
        
    private Address address;
        
    private List<Phone> phones;
        
    private IDCard idCard;
        
    private Country country;
        
    private List<Car> cars;
        
    private List<Flight> flights;

        @ManyToMany(cascade 
    = CascadeType.ALL)
        @JoinTable(name 
    = "PersonANDFlight", joinColumns = {@JoinColumn(name = "personID")}, inverseJoinColumns = {@JoinColumn(name = "flightID")})
        
    public List<Flight> getFlights() {
            
    return flights;
        }

        
    public void setFlights(List<Flight> flights) {
            
    this.flights = flights;
        }

        @OneToMany(cascade 
    = CascadeType.ALL, mappedBy = "person")
        
    public List<Car> getCars() {
            
    return cars;
        }

        
    public void setCars(List<Car> cars) {
            
    this.cars = cars;
        }

        @ManyToOne(cascade 
    = CascadeType.ALL)
        @JoinColumn(name 
    = "countryID")
        
    public Country getCountry() {
            
    return country;
        }

        
    public void setCountry(Country country) {
            
    this.country = country;
        }

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

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

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

        
    public void setPhones(List<Phone> phones) {
            
    this.phones = phones;
        }

        @OneToOne(cascade 
    = {CascadeType.ALL})
        
    public Address getAddress() {
            
    return address;
        }

        
    public void setAddress(Address address) {
            
    this.address = address;
        }

        
    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;
        }
    }

     代表航班的Flight類的代碼:
    /*
     * Flight.java
     * 
     * Created on 2007-9-24, 14:35:45
     * 
     * 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.Date;
    import java.util.List;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.ManyToMany;
    import javax.persistence.Temporal;

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

        @Temporal(javax.persistence.TemporalType.TIME)
        
    public Date getArriveTime() {
            
    return arriveTime;
        }

        
    public void setArriveTime(Date arriveTime) {
            
    this.arriveTime = arriveTime;
        }

        
    public String getFlightNumber() {
            
    return flightNumber;
        }

        
    public void setFlightNumber(String flightNumber) {
            
    this.flightNumber = flightNumber;
        }

        
    public String getFromCity() {
            
    return fromCity;
        }

        
    public void setFromCity(String fromCity) {
            
    this.fromCity = fromCity;
        }

        @Temporal(javax.persistence.TemporalType.TIME)
        
    public Date getLeaveTime() {
            
    return leaveTime;
        }

        
    public void setLeaveTime(Date leaveTime) {
            
    this.leaveTime = leaveTime;
        }
        @ManyToMany(mappedBy
    ="flights")
        
    public List<Person> getPersons() {
            
    return persons;
        }

        
    public void setPersons(List<Person> persons) {
            
    this.persons = persons;
        }

        
    public String getToCity() {
            
    return toCity;
        }

        
    public void setToCity(String toCity) {
            
    this.toCity = toCity;
        }
        
    private String flightNumber;
        
    private String fromCity,toCity;
        
    private Date leaveTime,arriveTime;
        
    private List<Person> persons;
        
        
    public void setId(Long id) {
            
    this.id = id;
        }

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

    }

    我們再來看一看ManyToMany的聲明
    public @interface ManyToMany
    {
       Class targetEntity( ) 
    default void.class;
       CascadeType[] cascade( ) 
    default {};
       FetchType fetch( ) 
    default LAZY;
       String mappedBy( ) 
    default "";
    }

    從代碼可以看出,注釋都差不多,只不過多對多的時候,僅僅從兩張用外鍵相連是不夠的,必須生成一張用于連接的中間表.也就如下代碼所聲明的地方:
    @ManyToMany(cascade = CascadeType.ALL)
        @JoinTable(name = "PersonANDFlight", joinColumns = {@JoinColumn(name = "personID")}, inverseJoinColumns = {@JoinColumn(name = "flightID")})
        public List<Flight> getFlights() {
            return flights;
        }

    我們聲明了一張用來連接的表,并且聲明了主控端的列名和反轉端的列名,其實這個聲明不是必要的,當我們不用@JoinTable來聲明的時候,JBOSS也會為我們自動生成一個連接用的表,表名默認是主控端的表名加上下劃線"_"再加上反轉端的表名.

    從上面的注釋我們可以看出,此關系的主控端在Person這一方,因為我們可以在Flight那一方看到如下注釋:
    @ManyToMany(mappedBy="flights")
        public List<Person> getPersons() {
            return persons;
        }

    正是因為雙向關系的存在,也由于Person是主控端, 所以Person要取消某次預定只要remove相應的Flight就可以了,而Flight由于是反轉端,所以雖然它也可以得到它的所有預定的人,但是它卻無法改變這種關系,即使它remove掉了某個Person,但是這種關系并不會在數據庫里面表現出來,因為畢竟航班是不能隨便取消一個人的登機資格的.

    其實按我的理解來說,多對多的雙向有點類似于一對多的單向,只不過雙方都是一對多,我們這個例子完全可以用一對多來實現,但是一對多實現的話,就會有很多重復的數據存在,因為每個關系都可能會有重復的元素,比如我們這個例子,如果一對多的話,每個航班都會對應幾百人,哪怕這幾百人下次還坐你的航班,你還要重新定義一下.因為上次的幾百人的外鍵已經指向你了.還要再指向另一個你,必須要重新生成幾百個元素,所以在這種情況下,多對多就可以很好的重用數據庫里面的表了,在Person和Flight表中,都不會有重復的元素存在了.并且關系也明朗了許多.




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

    你我共同品味JAVA的濃香.
    posted on 2007-09-25 09:00 千里冰封 閱讀(1100) 評論(3)  編輯  收藏 所屬分類: JAVAEE

    FeedBack:
    # re: EJB學習日記(13)
    2007-09-25 14:03 | Java.net
    打算用EJB做項目嗎?比較看到Spring+EJB+JSF的應用模式.
    使用Spring管理bean,ejb的無狀態會話bean,在Spring管理下的ejb比較優雅,但不知道效率會怎么樣.  回復  更多評論
      
    # re: EJB學習日記(13)
    2007-09-25 15:04 | 千里冰封
    呵呵,只是學學而已,我目前的工作還用不到EJB:)  回復  更多評論
      
    # re: EJB學習日記(13)
    2007-09-28 10:42 | 同聲傳譯
    學寫日記也一件很讓人有回憶感  回復  更多評論
      
    主站蜘蛛池模板: 国产精品亚洲一区二区麻豆| 久久精品蜜芽亚洲国产AV| 亚洲欧美国产精品专区久久| 麻花传媒剧在线mv免费观看| 亚洲AV人无码激艳猛片| 久久青草精品38国产免费| 情人伊人久久综合亚洲| 久9这里精品免费视频| 亚洲成a人片77777老司机| 18女人毛片水真多免费| 亚洲国产中文在线视频| 嫩草影院在线免费观看| 亚洲AV无码精品国产成人| 婷婷亚洲天堂影院| 一级一级一片免费高清| 亚洲AV综合色区无码一区爱AV | 未满十八18禁止免费无码网站| 今天免费中文字幕视频| 亚洲AV第一页国产精品| 免费黄网站在线观看| 亚洲制服丝袜一区二区三区| 免费看AV毛片一区二区三区| 香蕉国产在线观看免费| 国产亚洲成av片在线观看 | 日韩亚洲人成在线综合| 亚洲国产精品国产自在在线| 中文字幕不卡高清免费| 亚洲综合图片小说区热久久| 波多野结衣中文字幕免费视频| 亚洲日本在线观看视频| 精品国产免费一区二区三区香蕉| 午夜一区二区免费视频| av电影在线免费看| 久久丫精品国产亚洲av| 最新猫咪www免费人成| 成年网在线观看免费观看网址| 欧美最猛性xxxxx免费| 人妻免费久久久久久久了| 亚洲gv猛男gv无码男同短文| 99久久免费精品国产72精品九九| 亚洲综合在线视频|