ManyToOne

多对一,是最常见的表间关系,对应关系数据库中的外键关系。通常用于建立子实体和其父实体的关联关系

@Entity(name = "Person")
public static class Person {@Id@GeneratedValueprivate Long id;//Getters and setters are omitted for brevity

}@Entity(name = "Phone")
public static class Phone {@Id@GeneratedValueprivate Long id;@Column(name = "`number`")private String number;@ManyToOne@JoinColumn(name = "person_id",foreignKey = @ForeignKey(name = "PERSON_ID_FK"))private Person person;//Getters and setters are omitted for brevity

}

CREATE TABLE Person (id BIGINT NOT NULL ,PRIMARY KEY ( id )
)CREATE TABLE Phone (id BIGINT NOT NULL ,number VARCHAR(255) ,person_id BIGINT ,PRIMARY KEY ( id ))ALTER TABLE Phone
ADD CONSTRAINT PERSON_ID_FK
FOREIGN KEY (person_id) REFERENCES Person

例子:

Person person = new Person();
entityManager.persist( person );Phone phone = new Phone( "123-456-7890" );
phone.setPerson( person );
entityManager.persist( phone );entityManager.flush();
phone.setPerson( null );
INSERT INTO Person ( id )
VALUES ( 1 )INSERT INTO Phone ( number, person_id, id )
VALUES ( '123-456-7890', 1, 2 )UPDATE Phone
SET    number = '123-456-7890',person_id = NULL
WHERE  id = 2

OneToMany

一对多用于建立父实体和子实体之间的关系。如果子实体侧没有对应的ManyToOne配置,则这个OneToMany是单向的。如果子实体侧有对应的ManyToOne配置,则这个OneToMany是双向的。双向的关系,可以让开发者在两侧都能获取关联关系。

单向的一对多关系,实例:

@Entity(name = "Person")
public static class Person {@Id@GeneratedValueprivate Long id;@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)private List<Phone> phones = new ArrayList<>();//Getters and setters are omitted for brevity

}@Entity(name = "Phone")
public static class Phone {@Id@GeneratedValueprivate Long id;@Column(name = "`number`")private String number;//Getters and setters are omitted for brevity

}
CREATE TABLE Person (id BIGINT NOT NULL ,PRIMARY KEY ( id )
)CREATE TABLE Person_Phone (Person_id BIGINT NOT NULL ,phones_id BIGINT NOT NULL
)CREATE TABLE Phone (id BIGINT NOT NULL ,number VARCHAR(255) ,PRIMARY KEY ( id )
)ALTER TABLE Person_Phone
ADD CONSTRAINT UK_9uhc5itwc9h5gcng944pcaslf
UNIQUE (phones_id)ALTER TABLE Person_Phone
ADD CONSTRAINT FKr38us2n8g5p9rj0b494sd3391
FOREIGN KEY (phones_id) REFERENCES PhoneALTER TABLE Person_Phone
ADD CONSTRAINT FK2ex4e4p7w1cj310kg2woisjl2
FOREIGN KEY (Person_id) REFERENCES Person

 Hibernate对单向的一对多关系,两个实体对应两个表,关联关系使用一个中间表来表达。单向一对多在级联操作上比较低效。

双向一对多

    Hibernate处理双向一对多关系,按多对一的关系来处理,本质上还是主外键关系。双向的一对多使父子双方都能能力来获取关联关系。使操作更方便,效率等同多对一。

    

@Entity(name = "Person")
public static class Person {@Id@GeneratedValueprivate Long id;@OneToMany(mappedBy = "person", cascade = CascadeType.ALL, orphanRemoval = true)private List<Phone> phones = new ArrayList<>();//Getters and setters are omitted for brevitypublic void addPhone(Phone phone) {phones.add( phone );phone.setPerson( this );}public void removePhone(Phone phone) {phones.remove( phone );phone.setPerson( null );}
}@Entity(name = "Phone")
public static class Phone {@Id@GeneratedValueprivate Long id;@NaturalId@Column(name = "`number`", unique = true)private String number;@ManyToOneprivate Person person;//Getters and setters are omitted for brevity
@Overridepublic boolean equals(Object o) {if ( this == o ) {return true;}if ( o == null || getClass() != o.getClass() ) {return false;}Phone phone = (Phone) o;return Objects.equals( number, phone.number );}@Overridepublic int hashCode() {return Objects.hash( number );}
}
CREATE TABLE Person (id BIGINT NOT NULL ,PRIMARY KEY ( id )
)CREATE TABLE Phone (id BIGINT NOT NULL ,number VARCHAR(255) ,person_id BIGINT ,PRIMARY KEY ( id )
)ALTER TABLE Phone
ADD CONSTRAINT UK_l329ab0g4c1t78onljnxmbnp6
UNIQUE (number)ALTER TABLE Phone
ADD CONSTRAINT FKmw13yfsjypiiq0i1osdkaeqpg
FOREIGN KEY (person_id) REFERENCES Person

转载于:https://www.cnblogs.com/hengwu/p/9864489.html

Hibernate之表间关系相关推荐

  1. Access和SQL server开启表间关系,并实现更新或删除母表数据自动更新或删除子表数据...

    1.Access开启表间关系,并实现删除母表数据自动删除子表数据: 在Tables等界面 - > 右键 - > Relationships... -> 弹出Relationships ...

  2. SAP-MM采购订单相关的主要后台表间关系

    主要的表及描述如下: 1.相关表列举说明 EKPO 采购凭证项目 EKKO 采购凭证抬头 EORD 采购货源清单 EINA 采购信息记录 - 一般数据 EINE 采购信息记录 - 采购组织数据 EKE ...

  3. mysql的关系表_mysql 数据库表间关系图怎么查看?

    展开全部 mysql数据库表间的关系图可以通过navicat查看: 第一步:下载navicat打开: 第二步:点击navicat界面最右下角标注的按钮即可62616964757a686964616fe ...

  4. 计算机 vfp表间关系有,VFP表间连接和VFP表的更新操作

    VFP表间连接和VFP表的更新操作 分类:计算机等级 | 更新时间:2016-07-08| 来源:转载 一.建立表间连接:有时需要将不同表的内容按某种条件重新组成一个新表,可用连接命令join来实现该 ...

  5. Rhythmk 学习 Hibernate 05 - Hibernate 表间关系 [ManyToOne,OneToMany]

    1.项目结构: 1.1.场景说明: 一个订单,包含多个产品 1.2.类文件: Order.java package com.rhythmk.model;import java.util.Date;pu ...

  6. vs05b2中给dataset添加表间关系

    (转载)http://www.cnblogs.com/yang_sy/archive/2005/04/30/148344.aspx 转载于:https://www.cnblogs.com/loway/ ...

  7. SQL server数据库项目案例:QQ数据库管理(QQ用户表,基本信息表和关系表,QQ好友和黑名单人物设置)

    一.数据库表准备 三个表:(1)QQUser用户表.(2)BaseInfo基本信息表.(3)Relation关系表 二.各表的约束条件 1 QQ密码不得少于6位: 2 在线状态的值必须位0,1,2 0 ...

  8. 解析SQL的表间血缘关系工具

    一.sqllineage SQL Lineage Analysis Tool powered by Python 源码地址:https://github.com/reata/sqllineage 安装 ...

  9. Django ORM – 多表实例:Django模型Model的定义+模型间关系

    Django 对各种数据库提供了很好的支持,包括:PostgreSQL.MySQL.SQLite.Oracle. Django 为这些数据库提供了统一的调用API. 我们可以根据自己业务需求选择不同的 ...

最新文章

  1. python 例子生成随机数,读文件
  2. 前端技术分享:Nginx负载均衡视频,基础的实战应用
  3. mysql存储过程是什么
  4. Ribbon、Feign和OpenFeign的区别来了
  5. 3 MM配置-企业结构-定义-定义库存地点
  6. c语言ntc程序,NTC热敏电阻测温度 单片机C和汇编源程序
  7. 去哪儿网2018春招软件开发工程师、前段开发工程师编程题 - 题解
  8. linux与python客户端,LINUX平台下DM7与Python的适配
  9. 小D课堂 - 新版本微服务springcloud+Docker教程_5-06 高级篇幅之深入源码
  10. Python3入门机器学习经典算法与应用 第3章 matplotlib基础
  11. android编译log中_安卓编译 Jack server 错误问题解决办法
  12. excel2016html,excel2016打开不显示内容《2016版本的excel表格》
  13. 以下哪一个不属于python语言的特点-智慧树知到《Python程序设计基础》章节测试答案...
  14. 写一个加密程序对文件加密
  15. 如何在cisco官网上下载Cisco packet tracer模拟器
  16. love2d 编译 android,Love2D游戏脚本在windows平台下打包exe发布教程
  17. UG NX10.0制图——修改单位小数位数
  18. 2021-2027全球与中国气溶胶粒径谱仪市场现状及未来发展趋势
  19. qcow2和vmdk互相转
  20. linux安装两个独立显卡驱动,Manjaro Linux 双显卡安装步骤及独立显卡运行游戏(Nvidia GeForce GTX 980m)...

热门文章

  1. 【牛客 - 272D】Where are you(Tarjan求桥)
  2. 【HihoCoder - 1850】字母去重 (字符串,思维)
  3. 【POJ - 1062】【nyoj - 510】昂贵的聘礼 (Dijkstra最短路+思维)
  4. 使用linux内核编译独立系统,编译linux内核以及depmod的使用
  5. python split函数 空格_Python随笔29:Python基础编程练习题23~24
  6. linux多进程原理,Linux进程调度
  7. 《Python Cookbook 3rd》笔记(4.16):迭代器代替 while 无限循环
  8. 网络防火墙单向和双向_单向晶闸管与双向晶闸管之间的不同之处
  9. 密码学专题 OpenSSL中SSL相关指令
  10. 英语口语-文章朗读Week10 Thursday