1. 程式人生 > >JPA 菜鳥教程 6 單向多對多

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 只能繼承一個類。 使用