JPA 菜鳥教程 6 單向多對多
GitHub
JPA中的@ManyToMany
@ManyToMany註釋表示模型類是多對多關係的一端。
@JoinTable 描述了多對多關係的資料表關係。
- name 屬性指定中間表名稱
- joinColumns 定義中間表與Teacher 表的外來鍵關係
- inverseJoinColumns屬性定義了中間表與另外一端(Student)的外來鍵關係
單向多對多表的ddl語句
CREATE TABLE `t_student` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`sname` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
CREATE TABLE `t_teacher` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`tname` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
CREATE TABLE `t_teacher_student` (
`teacher_id` bigint(20) NOT NULL,
`student_id` bigint(20) NOT NULL,
PRIMARY KEY (`teacher_id`,`student_id`),
KEY `FK_o82lxg0wi1y88lit4fy7lkg7t` (`student_id`),
CONSTRAINT `FK_1epgkih044inndyv1dtihcb7r` FOREIGN KEY (`teacher_id`) REFERENCES `t_teacher` (`id`),
CONSTRAINT `FK_o82lxg0wi1y88lit4fy7lkg7t` FOREIGN KEY (`student_id`) REFERENCES `t_student` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Student
package com.jege.jpa.many2many;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* @author JE哥
* @email [email protected]
* @description:單向
*/
@Entity
@Table(name = "t_student")
public class Student {
@Id
@GeneratedValue
private Long id;
private String sname;
public Student() {
}
public Student(String sname) {
this.sname = sname;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
@Override
public String toString() {
return "Student [id=" + id + ", sname=" + sname + "]";
}
}
Teacher
package com.jege.jpa.many2many;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
/**
* @author JE哥
* @email [email protected]
* @description:單向:一個老師教多個學生
*/
@Entity
@Table(name = "t_teacher")
public class Teacher {
@Id
@GeneratedValue
private Long id;
private String tname;
// @ManyToMany註釋表示Teacher是多對多關係的一端。
// @JoinTable描述了多對多關係的資料表關係。name屬性指定中間表名稱,joinColumns定義中間表與Teacher表的外來鍵關係。
// 中間表Teacher_Student的Teacher_ID列是Teacher表的主鍵列對應的外來鍵列,inverseJoinColumns屬性定義了中間表與另外一端(Student)的外來鍵關係。
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name = "t_teacher_student", joinColumns = { @JoinColumn(name = "teacher_id") }, inverseJoinColumns = {
@JoinColumn(name = "student_id") })
private Set<Student> students = new HashSet<Student>();
public Teacher() {
}
public Teacher(String tname) {
this.tname = tname;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTname() {
return tname;
}
public void setTname(String tname) {
this.tname = tname;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
@Override
public String toString() {
return "Teacher [id=" + id + ", tname=" + tname + "]";
}
}
Many2ManyTest
package com.jege.jpa.many2many;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* @author JE哥
* @email [email protected]
* @description:單向多對多Test
*/
public class Many2ManyTest {
private static EntityManagerFactory entityManagerFactory = null;
private EntityManager entityManager = null;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
entityManagerFactory = Persistence.createEntityManagerFactory("com.jege.jpa");
}
// t1老師教2個學生s1,s2
// t2老師教3個學生s1,s2,s3
// 總共10條insert
@Test
public void persist() throws Exception {
entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
Teacher t1 = new Teacher("t1");
Teacher t2 = new Teacher("t2");
Student s1 = new Student("s1");
Student s2 = new Student("s2");
Student s3 = new Student("s3");
entityManager.persist(t1);
entityManager.persist(t2);
entityManager.persist(s1);
entityManager.persist(s2);
entityManager.persist(s3);// 全部發出5條insert單表
// 新增中間表
// t1老師教2個學生s1,s2
// t2老師教3個學生s1,s2,s3
t1.getStudents().add(s1);
t1.getStudents().add(s2);
t2.getStudents().add(s1);
t2.getStudents().add(s2);
t2.getStudents().add(s3);
entityManager.getTransaction().commit();// 發出5條insert中間表
entityManager.close();
}
// t1老師教2個學生s1,s2
// 修改為 教2個學生s1,s3:先刪除在新增
@Test
public void update() throws Exception {
persist();
entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
Teacher t1 = entityManager.find(Teacher.class, 1L);
Student s2 = entityManager.find(Student.class, 2L);
Student s3 = entityManager.find(Student.class, 3L);
// 刪除
t1.getStudents().remove(s2);
// 新增
t1.getStudents().add(s3);
entityManager.getTransaction().commit();
}
// 刪除t1的教的所有學生
@Test
public void delete() throws Exception {
persist();
entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
Teacher t1 = entityManager.find(Teacher.class, 1L);
t1.getStudents().clear();
entityManager.getTransaction().commit();
}
@After
public void tearDown() throws Exception {
if (entityManager != null && entityManager.isOpen())
entityManager.close();
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
if (entityManagerFactory != null && entityManagerFactory.isOpen())
entityManagerFactory.close();
}
}
原始碼地址
如果覺得我的文章或者程式碼對您有幫助,可以請我喝杯咖啡。
您的支援將鼓勵我繼續創作!謝謝!
相關推薦
JPA 菜鳥教程 6 單向多對多
GitHub JPA中的@ManyToMany @ManyToMany註釋表示模型類是多對多關係的一端。 @JoinTable 描述了多對多關係的資料表關係。 name 屬性指定中間表名稱 joinColumns 定義中間表與Teach
JPA 菜鳥教程 3 單向多對一
GitHub JPA中的@ManyToOne 主要屬性 - name(必需): 設定“many”方所包含的“one”方所對應的持久化類的屬性名 - column(可選): 設定one方的主鍵,即持久化類的屬性對應的表的外來鍵 - class
JPA 菜鳥教程 15 繼承-一個表-SINGLE_TABLE
column turn rate pre school fill 技術 一個表 tor 原地址:http://blog.csdn.net/JE_GE/article/details/53678422 繼承映射策略 一個類繼承結構一個表的策略,最終只生成一個表,這是繼承映射的
Spring Boot 菜鳥教程 6 全域性異常處理
GitHub @ControllerAdvice原始碼 package org.springframework.web.bind.annotation; import java.lang.annotation.Annotation; impor
JPA 菜鳥教程 19 jpa uuid主鍵生成策略
GitHub ddl語句 CREATE TABLE `t_user` ( `id` varchar(32) NOT NULL, `name` varchar(255) DEFAU
JPA 菜鳥教程 2 單表操作
GitHub JPA Sun官方提出的Java持久化規範。它為Java開發人員提供了一種物件/關係對映工具來管理Java應用中的關係資料。他的出現主要是為了簡化現有的持久化開發工作和整合ORM技術,結束現在Hibernate、TopLink等OR
# Mybatis(四)表間關係分析,高階對映(一對一,一對多,多對多) 菜鳥日記--day05(下_02)
Mybatis(四)表間關係分析,高階對映(一對一,一對多,多對多) 菜鳥日記–day05(下_02) 花了很多時間,去看sql複雜查詢,更新慢了 電腦斷電寫的太急,綠色補更 一、表間關係分析 1.分析資料庫表的方法 思路: 需要分模組的對多張表進行邏輯分析 表記錄
Alex 的 Hadoop 菜鳥教程: 第6課 Hbase 安裝教程
原帖地址: http://blog.csdn.net/nsrainbow/article/details/38515007 宣告: 本文基於Centos 6.x + CDH 5.x 官方英文安裝教程http://www.cloudera.com/content/cloud
Spring Boot 菜鳥教程 28 多配置檔案
GitHub 需求產生 開發過程中可能會有如下需求:開發和部署的配置資訊可能不同,常規的方式就是在配置檔案裡面先寫好開發配置,在部署的時候再去修改這些配置,這樣可能會出現很多問題,比如使用者名稱、密碼忘記了修改或者改錯了等問題。 專案結構圖片
菜鳥教程之工具使用(五)——JRebel與Windows服務的Tomcat集成
-m end 個人 再見 proc key pre 安裝 target 之前寫過一篇Tomcat借助JRebel支持熱部署的文章——《借助JRebel使Tomcat支持熱部署 》。介紹的是在開發、測試環境中的配置。可是正式的部署環境。我們不會通過命令行來啟動Tomcat,
Angular js 過濾器 筆記(轉自菜鳥教程)
per test 筆記 ring ood filter 子集 true 貨幣格式 1、uppercase,lowercase 大小寫轉換 {{ "lower cap string" | uppercase }} // 結果:LOWER CAP STRING {{ "TA
菜鳥教程-練習實例答案I
core 其中a是一個數字 再落下 乘法 white 超過 -1 英文字母 三位數 題目:有四個數字:1、2、3、4,能組成多少個互不相同且無重復數字的三位數?各是多少? 1 #coding=utf-8 2 3 from itertools import permuta
NHibernate教程(11)--多對多關聯查詢
true 這一 -m hive 原生 .html etime virtual 及其 本節內容 多對多關系引入 多對多映射關系 多對多關聯查詢 1.原生SQL關聯查詢 2.HQL關聯查詢 3.Criteria API關聯查詢 結語 多對多關系引入 讓我們再次回顧在第
菜鳥教程 Python 手記 1
報錯信息 數據類型 字符串表 ring max last pda 每次 none Python是一種解釋型、面向對象、動態數據類型的高級程序設計語言。 編碼 編碼默認情況下,Python 3 源碼文件以 UTF-8 編碼,所有字符串都是 unicode 字符串。 當然你
菜鳥學python之類和對象
類 對象 我們把一類相同的事物叫做類,其中相同事物相同的屬性可以抽象出來,而一些相同的動作行為,也可以抽象成方法。 比如,汽車是一個類,它包括價格、品牌等屬性。那麽我們需要打印某一輛車的價格和品牌,只需要使用一句代碼 print "the car‘s type ‘ford’,price:280000",
sphinx 菜鳥教程
edt cool lis file lpad 抽象 mage settings length 簡介 Sphinx 是一種工具,它允許開發人員以純文本格式編寫文檔,以便采用滿足不同需求的格式輕松生成輸出。這在使用 Version Control System 追蹤變更時非常有
JPA多對多
ren ref sid amp dia .com pos idt 圖片 ? 在雙向多對多關系中,我們必須指定一個關系維護端(owner side),可以通過 @ManyToMany 註釋中指定 mappedBy 屬性來標識其為關系維護端。 @ManyToMany @Jo
Java 8 新特性-菜鳥教程 (3) -Java 8 函數式接口
但是 style vax arr 結果 友好 face todo 兩個 Java 8 函數式接口 函數式接口(Functional Interface)就是一個有且僅有一個抽象方法,但是可以有多個非抽象方法的接口。 函數式接口可以被隱式轉換為lambda表達式。 函數式接口
Linux學習_菜鳥教程_1
ssh sync 起點 計算機 16px 指令 span 語句 完成 Linux系統啟動過程:內核的引導 、運行init、系統初始化、建立終端、用戶登錄系統 內核引導:計算機開機,然後BIOS開機自檢,按照BIOS中設置的啟動設備(通常是硬盤)來啟動。 操作系統接管硬件以後
Java菜鳥教程———學習筆記
class this 關鍵字 多繼承 之間 字母 ext javac 多個 編譯錯誤 (1)Java中的繼承有兩種:extends 和 implements extends 類的繼承是單一繼承,也就是說,一個子類只能擁有一個父類,所以 extends 只能繼承一個類。 使用