Hibernate之表间关系

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450884.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python大神告诉你,学习Python应该读哪些书!

关注头条号&#xff0c;私信回复资料会有意外惊喜呦………………最后一张照片有资料呦。在传统的Web开发之外的领域&#xff0c;Python开发人员的就业机会越来越多&#xff0c;无论你是初学者还是大神&#xff0c;现在正是投入到Python学习的好时机。一个IBM的博客文章报道了如…

脚本语言

脚本语言&#xff08;Script language&#xff0c;scripting language&#xff0c;scripting programming language&#xff09;是为了缩短传统的编写-编译-链接-运行&#xff08;edit-compile-link-run&#xff09;过程而创建的计算机编程语言。此命名起源于一个脚本“screenp…

Java Agent

一、什么是 Java Agent &#xff1f; 笼统地来讲&#xff0c;Java Agent 是一个统称&#xff0c;该功能是 Java 虚拟机提供的一整套后门。通过这套后门可以对虚拟机方方面面进行监控与分析。甚至干预虚拟机的运行。 Java Agent 又叫做 Java 探针&#xff0c;Java Agent 是在 …

JDK 1.8 官网下载地址(linux / windows)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 JDK 1.8 官网下载地址&#xff1a; JDK 1.8 官网下载地址&#xff08;linuxwindows&#xff09; 上面连接可以直接点击&#xff0c;连接…

跟着太白老师学python day11 可迭代对象和迭代器

如果对象的属性中有__iter__属性就说明是可迭代的&#xff0c;容器类的数据类型都是可迭代对象 如果对象的属性中既有__iter__属性也有__next__属性&#xff0c;就说明这个对象是迭代器 如何判断一个函数是不是可迭代的&#xff0c;是不是迭代器 方法一 s 123 print(__iter__ …

搅局者奇虎360:特供机背后的周式隐忧

摘要&#xff1a;从未涉足制造&#xff0c;将来也“绝不参与制造”的360&#xff0c;却声称要进军智能手机。从未涉足制造&#xff0c;将来也“绝不参与制造”的360&#xff0c;却声称要进军智能手机。 5月4日晚间&#xff0c;“长达半年的思考”后&#xff0c;奇虎360董事长周…

数据结构基础入门知识

数据结构基础入门知识 ------ 数据结构&#xff1a;理解和练习《异类-不一样的成功启示录》IP/26 192IP/25 128IP/24192.12864 3216 2 1 NTP:时间同步服务器高手都是最仔细的&#xff0c;严谨的 telnet 查看某个端口是否可用&#xff0c;是否是开启状态的要有探索冒险的精神 --…

Linux下安装jdk8步骤详述

见&#xff1a;https://www.cnblogs.com/shihaiming/p/5809553.html 0.下载jdk8 登录网址&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 选择对应jdk版本下载。&#xff08;可在Windows下下载完成后&#xff0c;通过文件夹…

用Kotlin撸一个图片压缩插件-实战篇(三)

简述: 由于个人原因&#xff0c;已经有很长一段时间没有写过文章&#xff0c;有句话是那么说的只要开始就不会太晚&#xff0c;所以我们开始《用Kotlin撸一个图片压缩插件》系列文章最后一篇实战篇。实际上我已经把源码发布到了GitHub&#xff0c;代码很简单。有了前两篇文章的…

后端进阶技术总结

1、SDK与API的区别&#xff1f; SDK是Software Development Kit的缩写&#xff0c;即软件开发工具包。可以把SDK想象成一个虚拟的程序包&#xff0c;在这个程序包中有一份做好的软件功能&#xff0c;这份程序包几乎是全封闭的&#xff0c;通过接口联通外界&#xff0c;相应的接…

最简容器化动手小实践——再战flappybird

《Flappy Bird》是一名越南开发者所开发的游戏&#xff0c;这款游戏的主要内容是帮助一只小鸟穿越水管的层层阻碍&#xff0c;玩家所需要的只是点击屏幕从而调整小鸟的高度。而令这款游戏与众不同的是&#xff0c;这款游戏的难度夸张的惊人&#xff0c;大多数玩家在初次上手之后…

为什么电影电视帧率不取整数?

英文名称&#xff1a;time code时间码概念时间码&#xff08;time code&#xff09;是摄像机在记录图像信号的时候&#xff0c;针对每一幅图像记录的唯一的时间编码。一种应用于流的数字信号。该信号为视频中的每个帧都分配一个数字&#xff0c;用以表示小时、分钟、秒钟和帧数…

linux下用rpm 安装jdk

1.下载jdk的rpm安装包&#xff0c;这里以jdk-7u4-linux-i586.rpm为例进行说明 下载地址&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/index.html 2. 将jdk-7u4-linux-i586.rpm 移动到合适的安装目录上&#xff0c;安装软件不要在/home路径下&#xf…

FFT 入门

推荐博客 &#xff1a; https://oi.men.ci/fft-notes/ 卷积的理解 &#xff1a; https://www.zhihu.com/question/22298352?rf21686447 题目链接 &#xff1a;http://uoj.ac/problem/34 这是一道模板题。给你两个多项式&#xff0c;请输出乘起来后的多项式。输入格式第一行两个…

MPEG4视频压缩编码技术详解

MPEG全称是Moving Pictures Experts Group&#xff0c;它是“动态图象专家组”的英文缩写&#xff0c;该专家组成立于1988年&#xff0c;致力于运动图像及其伴音的压缩编码标准化工作&#xff0c;原先他们打算开发MPEG1、MPEG2、MPEG3和MPEG4四个版本&#xff0c;以适用于不同带…

oracle orion hugepages_settings.sh(支持OEL 7,4.1内核)

orion需要首先配置hugepage&#xff0c;否则会出现下列错误。[rootyyxxdb01 ~]# /opt/app/11.2.0/grid_home/bin/orion -run oltp -testname mytestORION: ORacle IO Numbers -- Version 11.2.0.4.0************************ Large Pages Information *******************Param…

eclipse启动出现“An Error has Occurred. See the log file”解决方法

见&#xff1a;http://blog.csdn.net/ww130929/article/details/52652222 这段时间开发java的项目&#xff0c;刚开始启动Eclipse的时候经常遇到这个问题&#xff0c;写这篇博客来记录解决方法。 1.删除工程目录下的&#xff1a; “.metadata/.plugins/org.eclipse.core.resour…

初识NIO之Java小Demo

Java中的IO、NIO、AIO&#xff1a; BIO&#xff1a;在Java1.4之前&#xff0c;我们建立网络连接均使用BIO&#xff0c;属于同步阻塞IO。默认情况下&#xff0c;当有一条请求接入就有一条线程专门接待。所以&#xff0c;在客户端向服务端请求时&#xff0c;会询问是否有空闲线程…

RTP协议详解

RTP协议分析 第1章. RTP概述 1.1. RTP是什么 RTP全名是Real-time Transport Protocol&#xff08;实时传输协议&#xff09;。它是IETF提出的一个标准&#xff0c;对应的RFC文档为RFC3550&#xff08;RFC1889为其过期版本&#xff09;。RFC3550不仅定义了RTP&#xff0…

线程状态转换

一、线程状态转换 新建&#xff08;New&#xff09; 创建后尚未启动。 可运行&#xff08;Runnable&#xff09; 可能正在运行&#xff0c;也可能正在等待 CPU 时间片。 包含了操作系统线程状态中的 Running 和 Ready。 阻塞&#xff08;Blocking&#xff09; 等待获取一个排它…