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的外键,不会产生中间表。