摘要:關(guān)系映射四種映射關(guān)系在關(guān)系數(shù)據(jù)庫中有表與表存在下面幾種關(guān)系多對一關(guān)系一對一關(guān)系一對多關(guān)系多對多關(guān)系也對應(yīng)這中四種映射關(guān)系單值串聯(lián)從一個實體實例關(guān)聯(lián)到另一個實體實例上其中目標基數(shù)為成為單值關(guān)聯(lián)多對一關(guān)系和一對一關(guān)系都是屬于這
JPA關(guān)系映射 四種映射關(guān)系
在關(guān)系數(shù)據(jù)庫中, 有表與表存在下面幾種關(guān)系
多對一關(guān)系(Many-to-One)
一對一關(guān)系(One-to-One)
一對多關(guān)系(One-to-Many)
多對多關(guān)系(Many-to-Many)
也對應(yīng)這JPA中四種映射關(guān)系.
單值串聯(lián)從一個實體實例關(guān)聯(lián)到另一個實體實例上, 其中目標基數(shù)為1, 成為單值關(guān)聯(lián)(single-valued association).
多對一關(guān)系和一對一關(guān)系都是屬于這一類, 因為源實體至多引用了一個目標實體.
來看這么一個關(guān)系, 員工(employee)和部門(department)之間的關(guān)系, 顯然一個員工只能屬于一個部門, 而一個部門
內(nèi)當然擁有多個員工, 所以從員工到部門的映射關(guān)系是多對一關(guān)系.
employee實體類
@Entity public class Employee { @Id private Integer id; private String name; private Long salary; @ManyToOne private Department department; public Employee() { } public Employee(Integer id) { this.id = id; } }
department實體類
@Data @Entity public class Department { @Id private Integer id; private String name; }
程序運行后, jpa創(chuàng)建表的sql語句如下
+------------+--------------------------------------+ | Table | Create Table | +------------+--------------------------------------+ | department | CREATE TABLE `department` ( | | | `id` int(11) NOT NULL, | | | `name` varchar(255) DEFAULT NULL, | | | PRIMARY KEY (`id`) | | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +------------+--------------------------------------+ +----------+---------------------------------------------------------------------------------------------------------+ | Table | Create Table | +----------+---------------------------------------------------------------------------------------------------------+ | employee | CREATE TABLE `employee` ( | | | `id` int(11) NOT NULL, | | | `name` varchar(255) DEFAULT NULL, | | | `salary` bigint(20) DEFAULT NULL, | | | `department_id` int(11) DEFAULT NULL, | | | PRIMARY KEY (`id`), | | | KEY `FKbejtwvg9bxus2mffsm3swj3u9` (`department_id`), | | | CONSTRAINT `FKbejtwvg9bxus2mffsm3swj3u9` FOREIGN KEY (`department_id`) REFERENCES `department` (`id`) | | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +----------+---------------------------------------------------------------------------------------------------------+
department_id是jpa創(chuàng)建的外鍵, 如果想指定外鍵的名字, 可以通過@JoinColumn來聲明外鍵的名字
一對一映射對于員工來說, 只有一個停車位(PackingSpace), 所以員工對停車位來說是一對一映射關(guān)系
修改EMPLOYEE類
@Data @Entity public class Employee { @Id private Integer id; private String name; private Long salary; @ManyToOne @JoinColumn(name = "dept_id") private Department department; @OneToOne @JoinColumn(name = "p_space_id") private ParkingSpace parkingSpace; public Employee() { } public Employee(Integer id) { this.id = id; } }
創(chuàng)建PackingSpace實體類
@Data @Entity public class ParkingSpace { @Id private Integer id; private String location; }
查看parking_space表和employee表
+---------------+-----------------------------------------+ | Table | Create Table | +---------------+-----------------------------------------+ | parking_space | CREATE TABLE `parking_space` ( | | | `id` int(11) NOT NULL, | | | `location` varchar(255) DEFAULT NULL, | | | PRIMARY KEY (`id`) | | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +---------------+-----------------------------------------+ +----------+---------------------------------------------------------------------------------------------------------+ | Table | Create Table | +----------+---------------------------------------------------------------------------------------------------------+ | employee | CREATE TABLE `employee` ( | | | `id` int(11) NOT NULL, | | | `name` varchar(255) DEFAULT NULL, | | | `salary` bigint(20) DEFAULT NULL, | | | `dept_id` int(11) DEFAULT NULL, | | | `p_space_id` int(11) DEFAULT NULL, | | | PRIMARY KEY (`id`), | | | KEY `FKaqchbcb8i6nvtl9g6c72yba0p` (`dept_id`), | | | KEY `FKd383146ko181lfhm1xuy3arci` (`p_space_id`), | | | CONSTRAINT `FKaqchbcb8i6nvtl9g6c72yba0p` FOREIGN KEY (`dept_id`) REFERENCES `department` (`id`), | | | CONSTRAINT `FKd383146ko181lfhm1xuy3arci` FOREIGN KEY (`p_space_id`) REFERENCES `parking_space` (`id`) | | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +----------+---------------------------------------------------------------------------------------------------------+雙向一對一映射
對于員工來說, 至多只能擁有一個停車位, 對于停車位來說, 也至多只能屬于一個員工, 所以兩個方向都是一對一關(guān)系, 這被稱為雙向一對一關(guān)系
修改ParkingSpace實體類
@Data @Entity public class ParkingSpace { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; private String location; @OneToOne(mappedBy = "parkingSpace") @JoinColumn(name = "emp_id") private Employee employee; @Override public String toString() { return "ParkingSpace{" + "id=" + id + ", location="" + location + """ + "}"; } }
在雙向一對一關(guān)系中, 如果雙方都有mapperBy, name這樣是不合法, 如果雙方都沒有mapperBy, 這樣是不正確的, 因為如果雙方都沒有mapperBy,
則當前不是雙向一對一關(guān)系, 而是兩個單向的一對一關(guān)系.
當源實體引用一個或者多個目標實體實例時, 將使用一個多值關(guān)聯(lián)(many-valued association). 一對多關(guān)聯(lián)和多對多映射都符合
一對多映射前面對于員工來說, 對于部門是多對一映射, 多個員工屬于一個部門, 相反的, 對于部門來說, 對員工是一對多的映射, 對于一個部門來說, 擁有多個員工,
所以也是雙向的關(guān)系
修改department實體類
@Data @Entity public class Department { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; private String name; @OneToMany(mappedBy = "department") private List多對多映射employees; }
員工與項目的關(guān)系也是多對多的關(guān)系, 一個員工大概率不會只會做一個項目, 一個項目大概率也不會只交給一個員工做
增加項目實體類
@Data @Entity public class Project { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; private String name; @ManyToMany(mappedBy = "projects") private Listemployees; }
在員工實體類中添加如下
@ManyToMany private Listprojects;
查看創(chuàng)建的表
+---------------------+ | Tables_in_db_projpa | +---------------------+ | department | | employee | | employee_projects | | hibernate_sequence | | parking_space | | project | +---------------------+
可以看到除了創(chuàng)建project表外, 還創(chuàng)建了表employee_projects表, 沒有對這個連接表進行配置, 是根據(jù)jpa默認規(guī)則進行創(chuàng)建的, 創(chuàng)表的sql語句為
+-------------------+-------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------------------+-------------------------------------------------------------------------------------------------------+ | employee_projects | CREATE TABLE `employee_projects` ( | | | `employees_id` int(11) NOT NULL, | | | `projects_id` int(11) NOT NULL, | | | KEY `FKg10a7uho2lylw8g080l5j4gyk` (`projects_id`), | | | KEY `FK88mdj5vmp7md19u4cbq154dk6` (`employees_id`), | | | CONSTRAINT `FK88mdj5vmp7md19u4cbq154dk6` FOREIGN KEY (`employees_id`) REFERENCES `employee` (`id`), | | | CONSTRAINT `FKg10a7uho2lylw8g080l5j4gyk` FOREIGN KEY (`projects_id`) REFERENCES `project` (`id`) | | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +-------------------+-------------------------------------------------------------------------------------------------------+使用@JoinTable來配置連接表
修改員工實體類, 添加@JoinTable注解
@ManyToMany @JoinTable(name = "emp_proj", joinColumns = @JoinColumn(name = "emp_id"), inverseJoinColumns = @JoinColumn(name = "proj_id")) private Listprojects;
可以看到表名和字段名都相應(yīng)變化了
+----------+-------------------------------------------------------------------------------------------------+ | Table | Create Table | +----------+-------------------------------------------------------------------------------------------------+ | emp_proj | CREATE TABLE `emp_proj` ( | | | `emp_id` int(11) NOT NULL, | | | `proj_id` int(11) NOT NULL, | | | KEY `FKj350n5wr8yyesit27cw0agpjq` (`proj_id`), | | | KEY `FK10tf71i5h7os8kdrpm2k97gn2` (`emp_id`), | | | CONSTRAINT `FK10tf71i5h7os8kdrpm2k97gn2` FOREIGN KEY (`emp_id`) REFERENCES `employee` (`id`), | | | CONSTRAINT `FKj350n5wr8yyesit27cw0agpjq` FOREIGN KEY (`proj_id`) REFERENCES `project` (`id`) | | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +----------+-------------------------------------------------------------------------------------------------+參考資料
Pro JPA 2: 精通Java持久化API
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/76633.html
摘要:表示一對一的映射關(guān)系,比如一個賬號對應(yīng)一個用戶,一個實體用來描述賬號的信息賬號,密碼,賬號是否可用,賬號對應(yīng)的角色等,另外一個實體用來描述用戶的信息昵稱,年齡,性別,國籍等。這里貼出源碼,一個關(guān)系映射的小例子原創(chuàng)不易,感謝支持。 @OneToOne, 表示一對一的映射關(guān)系,比如一個賬號對應(yīng)一個用戶,一個實體用來描述賬號的信息(賬號,密碼,賬號是否可用,賬號對應(yīng)的角色等),另外一個實體用...
摘要:當時,還飽受微軟和太陽間的訴訟的影響,該訴訟涉及到和間的兼容性。開發(fā)者們都在討論哪個平臺或者框架能夠勝出還是微軟新發(fā)布的。能為您提供端到端的應(yīng)用性能解決方案,我們支持所有常見的框架及應(yīng)用服務(wù)器,助您快速發(fā)現(xiàn)系統(tǒng)瓶頸,定位異常根本原因。 【編者按】關(guān)注 NoSQL 的動態(tài)發(fā)展很重要。NoSQL 的好處并不僅限于新的應(yīng)用開發(fā)。在某些案例中,你可以見識到重新訪問現(xiàn)有的、傳統(tǒng)的框架帶來的積極效...
摘要:說明首先來說是一個持久化規(guī)范,也就是說當我們用的時候我們不需要去選面向的編程了,這樣就大大降低了偶和度了引入是一種規(guī)范,那么它的編程有哪些要求呢引入下載的包導(dǎo)入文件夾,然后我們的在下面加上一個目錄在該文件夾下面加上一個文件,這個文件的規(guī)范 說明 首先來說JPA是一個持久化規(guī)范,也就是說當我們用jpa的時候我們不需要去選面向hibernate的api編程了,這樣就大大降低了偶和度了 引入...
閱讀 2891·2021-11-24 09:39
閱讀 2459·2019-08-30 15:53
閱讀 3033·2019-08-30 13:47
閱讀 1305·2019-08-30 12:50
閱讀 1485·2019-08-29 16:31
閱讀 2647·2019-08-29 13:14
閱讀 1564·2019-08-29 10:55
閱讀 797·2019-08-26 13:32