单向关系中的JoinColumn

1.person与address的一对一单向关系:数据库

在address中没有特殊的注解。编程

在Person中对应到数据库里面就有一个指向Address的外键.app

咱们也能够增长注释指定外键的列的名字,以下: 
@OneToOne(cascade=CascadeType.ALL,optional=true) 
@JoinColumn(name="addressID")//注释本表中指向另外一个表的外键。 
    public Address getAddress() { 
        return address; 
    } 
若是咱们不加的话,也是能够经过的,在JBOSS里面,它会自动帮你生成你指向这个类的类名加上下划线再加上id的列,也就是默认列名是:address_id
若是是主键相关联的话,那么能够运用以下注释 
@OneToOne(cascade={CascadeType.ALL}) 
   @PrimaryKeyJoinColumn 
   public Address getAddress( ) { 
      return homeAddress; 
   } 
它表示两张表的关联是根据两张表的主键的spa

—————————————————————————————————————————————————————————————————————code

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

phone中没有特别的注释。get

person中:it

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

 

咱们能够在Person类里面发现@JoinColumn(name="personID") 
它表明是一对多,一是指类自己,可能是指这个成员,也就是一个类能够对应多个成员. 
在一对多里面,不管是单向仍是双向,映射关系的维护端都是在多的那一方,也就是Phone那里,由于要在数据库面表现的话,也只有让Phone起一个指向Person的外键,不可能在Person里面指向Phone,这一点和一对一不同,一对一能够在任意一方起一个外键指向对方.但是一对多却不行了.io

在这里@JoinColumn这个注释指的倒是在Phone里面的外键的列的名字,List

它并不像在一对一里面的注释指的是本身表里面的外键列名.这一点要特别注意一下.


若是是一对多的双向关系,那么这个注释就要应用到多的那边去了,虽然注释还在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);

因此咱们最好仍是指定一下,以让程序产生更加肯定的行为,不过通常是推荐另外生成一个中间表好一些,由于这样的话,对原来两张表的结构不对形成任何影响。在遗留系统的时候不少用,有些时候,一些表都是之前就建好了的,要改表的结构是不太可能的,因此这个时候中间的表就显得很重要了,它能够在不侵入原来表的状况下构建出一种更清淅更易管理的关系。

因此一对多的单向关联,咱们仍是推荐使用一张中间表来创建关系。

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

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

country中无特别的注解。

而person注解以下:

@ManyToOne@JoinColumn(name="countryID")
    public Country getCountry() {        return country;
    }在一对多一对多一对的关系里面,关系的维护端都是在多的那一面,多的一面为主控方,拥有指向对方的外键。

由于主控端是Person .外键也是建在Person上面,由于它是多的一面。固然咱们在这里也能够省掉@JoinColumn,那样的话会怎么样呢,会不会像一对多单向同样生成中间的表呢?事实是不会的,在这里若是咱们去掉@JoinColumn的话,那么同样会在Person表里面生成一列指向

Country的外键,这一点和一对多的单向是不同,在一对多的单向里面,若是咱们不在Person 里面加上@JoinColumn这个注释,那么JBOSS将会为咱们生成一个中间的表,这个表会有一个列指向Person主键,一个列指向Phone主键。因此说为了程序有必定的行为,有些东西咱们仍是不要省的好。 
其实多对一单向是有点向一对一单向的,在主控端里面,也就是从Person的角度来看,也就是对应了一个Country而已,只不过这个Country是不少Person所共用的,而一对一却没有这一点限制。

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

4.person和project的多对多单向关系:

project没有特殊的注解。

person:

@ManyToMany

    public List<Project> getProjects() {        return projects;
    }

它须要设置中间表来维护关系,在数据库上跟多对多双向,只不过在编程的逻辑中不同而已。

//相似这个:@JoinTable(name = "PersonANDFlight", joinColumns = {@JoinColumn(name = "personID")},

//inverseJoinColumns = {@JoinColumn(name = "flightID")})

其实这个声明不是必要的,当咱们不用@JoinTable来声明的时候,JBOSS也会为咱们自动生成一个链接用的表,

表名默认是主控端的表名加上下划线"_"再加上反转端的表名.

相似

@ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "PersonANDFlight",

        joinColumns = {@JoinColumn(name = "personID")},

        inverseJoinColumns = {@JoinColumn(name = "flightID")})    public List<Flight> getFlights() {        return flights;
    }

 

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

在单向关系中没有mappedBy,主控方至关于拥有指向另外一方的外键的一方。

1.一对一和多对一的@JoinColumn注解的都是在“主控方”,都是本表指向外表的外键名称。

2.一对多的@JoinColumn注解在“被控方”,即一的一方,指的是外表中指向本表的外键名称。

3.多对多中,joinColumns写的都是本表在中间表的外键名称,

  inverseJoinColumns写的是另外一个表在中间表的外键名称。
相关文章
相关标签/搜索