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.pswp.cn/news/450884.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450884.shtml
英文地址,請注明出處:http://en.pswp.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; 等待獲取一個排它…