单向关系中的JoinColumn

来源:互联网 发布:女生喜欢大的吗 知乎 编辑:程序博客网 时间:2024/05/22 00:46

单向关系中的JoinColumn

  作者及来源: attitudedecidesall - 博客园    收藏到→_→:
摘要: 单向关系中的JoinColumn
"单向关系中的JoinColumn":
关键词:单向 关系 中 joincolumn

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

在address中没有特殊的注解。

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

我们也可以增加注释指定外键的列的名字,如下: 
@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; 
   } 
它表示两张表的关联是根据两张表的主键的

—————————————————————————————————————————————————————————————————————

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

phone中没有特别的注释。

person中:

@onetomany(cascade=cascadetype.all)@joincolumn(name="personid")//注释的是另一个表指向本表的外键。public list<phone> getphones() {      return phones;    }

 

我们可以在person类里面发现@joincolumn(name="personid") 
它代表是一对多,一是指类本身,多是指这个成员,也就是一个类可以对应多个成员. 
在一对多里面,无论是单向还是双向,映射关系的维护端都是在多的那一方,也就是phone那里,因为要在数据库面表现的话,也只有让phone起一个指向person的外键,不可能在person里面指向phone,这一点和一对一不一样,一对一

此文来自: 马开东博客 转载请注明出处 网址: http://www.makaidong.com

可以在任意一方起一个外键指向对方.可是一对多却不行了.

在这里@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);

所以我们最好还是指定一下,以让程序产生更加确定的行为,不过一般是推荐另外生成一个中间表好一些,因为这样的话,对原来两张表的结构不对造成任何影响。在遗留系统的时候很多用,有些时候,一些表都是以前就建好了的,要改表的结构是不太可能的,所以这个时候中间的表就显得很

此文来自: 马开东博客 转载请注明出处 网址: http://www.makaidong.com

重要了,它可以在不侵入原来表的情况下构建出一种更清淅更易管理的关系。

所以一对多的单向关联,我们还是推荐使用一张中间表来建立关系。

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

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注解在“被控方”,即一的一方,指的是外表中指向本表的外键名称。

搜索此文相关文章:单向关系中的JoinColumn
此文链接:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%8E%A8%E8%8D%90/29152.shtml
转载请注明出处:单向关系中的JoinColumn - 博客园
0 0