转自:https://www.cnblogs.com/lxmyhappy/p/6943344.html

在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,这一点和一对一不一样,一对一可以在任意一方起一个外键指向对方.可是一对多却不行了.

在这里@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 ADDCONSTRAINT 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写的是另一个表在中间表的外键名称。

@JoinColumn 详解相关推荐

  1. [转] @JoinColumn 详解 (javax.persistence.JoinColumn)

    原文链接:@JoinColumn详解  原文标的也是转载,但是没有注明原文链接,看起来乱乱的,所以整理一下转载过来,顺便细看一下 1. 一对一 现假设有Person表和Address表,是一对一的关系 ...

  2. SpringBoot注解最全详解(整合超详细版本)

    今日推荐强制双休!腾讯调整加班机制,21 点前必须离开工位 使用雪花id或uuid作为Mysql主键,被老板怼了一顿! 盘点 12 个 GitHub 上的高仿项目 CTO 说了,用错 @Autowir ...

  3. Spring Boot注解详解

    文章目录 使用注解的优势 注解详解(配备了完善的释义) 注解列表如下 JPA注解 springMVC相关注解 全局异常处理 项目中具体配置解析和使用环境 使用注解的优势 采用纯java代码,不在需要配 ...

  4. 《深入理解 Spring Cloud 与微服务构建》第十六章 Spring Boot Security 详解

    <深入理解 Spring Cloud 与微服务构建>第十六章 Spring Boot Security 详解 文章目录 <深入理解 Spring Cloud 与微服务构建>第十 ...

  5. 【SpringBoot 】SpringBoot注解详解

    [SpringBoot ]SpringBoot注解详解 一.注解(annotations)列表  @SpringBootApplication:包含了@ComponentScan.@Configura ...

  6. 一对一关联查询注解@OneToOne的实例详解

    表的关联查询比较复杂,应用的场景很多,本文根据自己的经验解释@OneToOne注解中的属性在项目中的应用.本打算一篇博客把增删改查写在一起,但是在改的时候遇到了一些问题,感觉挺有意思,所以写下第二篇专 ...

  7. Hibernate对象关系映射详解之一对多关系映射

    Hibernate对象关系映射详解之"一对多"关系映射 之前学习Hibernate框架的时候,对这七大关系映射一直是云里雾里的,虽然可以仿照写出代码,但是不能独立编写出来.鉴于工作 ...

  8. Spring Boot 项目部署方案 /打包 + Shell 脚本部署详解,稳的一批

    本篇和大家分享的是 Spring Boot 打包并结合 Shell 脚本命令部署,重点在分享一个shell 程序启动工具,希望能便利工作: profiles指定不同环境的配置 maven-assemb ...

  9. 一对一关联查询注解@OneToOne的实例详解(一)

    转载自: https://www.cnblogs.com/boywwj/p/8092915.html 一对一关联查询注解@OneToOne的实例详解 表的关联查询比较复杂,应用的场景很多,本文根据自己 ...

  10. @OneToOne实例详解

    主要是这一截: @Id// id自动生成@GeneratedValue@Column(name = "id")private Long id;@Column(name = &quo ...

最新文章

  1. python递归函数是指_python 函数递归作业求解析
  2. linux查询超线程,【转】Linux下判断一台机器是多少路,多少核,是否超线程的方法...
  3. 从源码理解ReentrantLock
  4. 用户都跑了,你却还分不清流失用户和流失率
  5. 谈Apache OFbiz 会员模块表结构设计
  6. 【RK3399Pro学习笔记】七、ROS订阅者Subscriber的编程实现
  7. java数组 arraylist_JAVA 用数组实现 ArrayList
  8. 音乐后台管理 歌手查询功能 ktv 1216
  9. CSS自学笔记(15):CSS3多列布局
  10. c语言半壁江山回调函数,回调函数运行时间太长影响了程序性能,怎么办
  11. 关于Oracle用sqlldr导入限制值长度大于255问题解决方法
  12. 在网页中插入背景音乐代码(html)
  13. ES 关于text和keyword两种类型数据搜索区别
  14. 让XP系统支持GPT硬盘
  15. QPSK数字调制系统在AWGN信道下的BER仿真
  16. 【洛谷】 P1424 小鱼的航程(改进版)(详细代码)
  17. 个人博客一文多发教程- OpenWriter管理工具基础使用方法
  18. MATLAB学习笔记-IEEE802.16d模型
  19. 2021年度总结:区块链农业技术领袖平台Dimitra
  20. 安装Office2010提示无法将数值写入注册表

热门文章

  1. 强化学习读书笔记 - 03 - 有限马尔科夫决策过程
  2. get------引用接口
  3. oracle 消除块竞争(hot blocks)
  4. 解决NetworkOnMainThreadException
  5. Oracle体系结构之控制文件管理
  6. [转载] 七龙珠第一部——第050话 海盗的陷阱
  7. Luogu4494 [HAOI2018]反色游戏 【割顶】
  8. BZOJ3757: 苹果树【树上莫队】
  9. 转载:牛客练习赛17 c 规律题
  10. java的迭代器详解