go4it

just do it

单向与双向的对比

1.一对一单向VS双向

-------------------------------单向---------------------------------------------

  person与address的一对一单向关系:

  在address中没有特殊的注解。

  在Person中对应到数据库里面就有一个指向Address的外键.我们也可以增加注释指定外键的列的名字,如下:

@OneToOne(cascade=CascadeType.ALL,optional=true) 
@JoinColumn(name="addressID")//注释本表中指向另一个表的外键。
    public Address getAddress() { 
        return address; 
    } 

 

------------------------------- 双向--------------------------------------------

person和IDCard的一对一双向关系

  person中

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

IDCard中:

@OneToOne(cascade=CascadeType.ALL,mappedBy="idCard",optional=false)
    public Person getPerson() {
        return person;
    }

其中person为主控方,关系的维护者,它的表里有指向IDCard的外键。

--------------------------------------------------------------------------------------------------------------------------------------

2.一对多单向VS双向

-------------------------单向-----------------------------------------

person和phone的一对多单向关系:

phone中没有特别的注释。

person中:

@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="personID")//注释的是另一个表指向本表的外键。
public List<Phone> getPhones() {
      return phones;
    }

-------------------------双向-----------------------------------------

person和car的一对多双向关系:

person中:

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

car中:

@ManyToOne(cascade=CascadeType.ALL,optional=false) 
    @JoinColumn(name="personID") 
public Person getPerson() { 
return person; 
    } 

----------------------------------------------------------------------------------------------------------------------------------------

3.多对多单向VS双向

------------------------单向---------------------------------------

person和country的多对一单向关系:

country中无特别的注解。

而person注解如下:

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

------------------------双向----------------------------------------

在person中

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

在fight中:

@ManyToMany(mappedBy="flights")
    public List<Person> getPersons() {
        return persons;
    }

 

 

--------------------------------------------------------------------

区别:

1.双向在一实体中多了mappedBy,明确了主控方拥有外键

2.JoinColumn一般在主控方里面设置。一对多单向例外,JoinColumn在被控方即一方中声明。

3.一对多,多对一,多对多中多的一方为主控方,关系的维护者,拥有外键。

4.双向的一对多关系和一对一关系中的mappedBy可以避免生成中间表。

5.JoinColumn在一对多单向关系里面,如果你不加@JoinColumn(name="personID")这个注释的话,

   那么JBOSS就会自动帮你生成一张中间表。

  JoinColumn在多对一单向关系里面,在这里如果我们去掉@JoinColumn的话,

  那么一样会在Person表里面生成一列指向Country的外键,不会产生中间表。

posted on 2009-01-22 18:27  cxccbv  阅读(1435)  评论(0)    收藏  举报

导航