1. 程式人生 > >多對多(老師and學生)

多對多(老師and學生)

ER

teacher:

欄位名 主鍵 型別 描述
id pk int 老師編號
name varchar 老師姓名

student:

欄位名 主鍵 型別 描述
id pk int 學生編號
name varchar 學生姓名

中間表:

tea_stu:

欄位名 主鍵 型別 描述
tea_id fk int 關聯教師id
stu_id fk int 關聯學生id

多對多:在操作和效能方面都不太理想,一般使用較少實際中最好轉換成一對多的物件模型,hibernate會為我們建立中間錶轉換成兩個一對多。

package domain;

import java.util.HashSet;
import java.util.Set;

public class Student {
	private int id;
	private String name;
	private Set<Teacher> teachers = new HashSet<Teacher>();
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Set<Teacher> getTeachers() {
		return teachers;
	}
	public void setTeachers(Set<Teacher> teachers) {
		this.teachers = teachers;
	}
	
	
}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  
<hibernate-mapping package="domain">
	<class name="Student" table="`student`">
	  	<id name="id" column="`id`">
	  	  <generator class="native"></generator>
	  	</id>
	  	<property name="name" column="name"/>
	  	<set name="teachers" table="tea_stu">
	  		<key column="student_id"></key>
	  		<many-to-many class="Teacher" column="teacher_id"></many-to-many>
	  	</set>
	  	</class>
	
</hibernate-mapping>
package domain;

import java.util.HashSet;
import java.util.Set;

public class Teacher {
	private int id;
	private String name;
	private Set<Student> students = new HashSet<Student>();
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Set<Student> getStudents() {
		return students;
	}
	public void setStudents(Set<Student> students) {
		this.students = students;
	}
	
}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  
<hibernate-mapping package="domain">
	<class name="Teacher" table="`teacher`">
	  	<id name="id" column="`id`">
	  	  <generator class="native"></generator>
	  	</id>
	  	<property name="name" column="name"/>
	  	<set name="students" table="tea_stu">
	  		<key column="teacher_id"></key>
	  		<many-to-many class="Student" column="student_id"></many-to-many>
	  	</set>
	  	</class>
	
</hibernate-mapping>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="connection.url">jdbc:mysql:///user</property>
		<property name="connection.username">root</property>
		<property name="connection.password">mysqladmin</property>
		<property name="show_sql">true</property>
		<property name="hbm2ddl.auto">create</property>
		<mapping resource="domain/Student.hbm.xml"/>
		<mapping resource="domain/Teacher.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

測試:

package test;

import java.util.HashSet;
import java.util.Set;

import org.hibernate.Transaction;
import org.hibernate.classic.Session;

import dao.HibernateUtil;
import domain.Student;
import domain.Teacher;

public class Many2Many {
	public static void main(String[] args) {
		add();
		query();
	}
	static void add(){
		
		Session session = null;
		Transaction tx = null;
		try {
			Set<Teacher> ts = new HashSet<Teacher>();
			Teacher t1 = new Teacher();
			t1.setName("tracher1");
			ts.add(t1);
			Teacher t2 = new Teacher();
			t2.setName("tracher2");
			ts.add(t2);
			
			Set<Student> ss = new HashSet<Student>();
			Student s1 = new Student();
			s1.setName("student1");
			ss.add(s1);
			Student s2 = new Student();
			s2.setName("student2");
			ss.add(s2);
			
//			t1.setStudents(ss);
//			t2.setStudents(ss);
			
			s1.getTeachers().add(t1);
			s1.getTeachers().add(t2);
			
			s2.setTeachers(ts);
			
			session = (Session) HibernateUtil.getSession();
			tx = session.beginTransaction();
			session.save(t1);
			session.save(t2);
			session.save(s1);
			session.save(s2);
			tx.commit();
			
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			if(session != null){
				session.close();
			}
		}
		
	}

	static void query(){
		Session session = null;
		Transaction tx = null;
		try {
			session = (Session) HibernateUtil.getSession();
			tx = session.beginTransaction();
			Teacher t = (Teacher)session.get(Teacher.class, 1);
			System.out.println("student's size:"+t.getStudents().size());
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			if(session != null){
				session.close();
			}
		}
		}
}

相關推薦

老師and學生

ER teacher: 欄位名 主鍵 型別 描述 id pk int 老師編號 name varchar 老師姓名 student: 欄位名 主鍵 型別 描述 id pk int 學生編號 name varchar 學生姓名 中間表: tea

mybatis 詳解------一對一、一對

不變 角色 導入 ctu transacti stat 工程 build -1   前面幾篇博客我們用mybatis能對單表進行增刪改查操作了,也能用動態SQL書寫比較復雜的sql語句。但是在實際開發中,我們做項目不可能只是單表操作,往往會涉及到多張表之間的關聯操作。那麽我

數據表對應關系一對一、一對

結果 ng- 垂直切分 包含 varchar 商品 記錄 padding borde ? 前言 本文主要介紹數據表的關聯關系,這是數據庫設計的常見問題之一。一個好的表結構設計,可以減少一些不必要的表或字段等。數據表之間的關聯關系分為三種:一對一、一對多、多對多。下面就逐一

Hibernate學習筆記 --- 創建基於中間關聯表的映射關系

mys 兩個 override pac tid 一對多 main ber different 多對多映射是在實際數據庫表關系之間比較常見的一種,仍然以電影為例,一部電影可以有多個演員,一個演員也可以參演多部電影,電影表和演員表之間就是“多對多”的關系 針對多對多的映射關系,

Java中映射關系

turn this mage log 演示 定義 ava copy setname 多對對的映射,可以用學生和課程進行演示。一個學生可以選擇多個課程,一個課程又對應了多個學生 定義學生類 class Stu{ private String name; p

Django CRM查詢一對以及相關的反查

mce field 需要 fff etime fcc nbsp pre 使用 Customer模型: class Customer(models.Model): name = models.CharField(max_length=32) qq =

NHibernate 基於 ClassMapping 的 ManyToMany配置

new 實體 virt cad get lmap entity hiberna ping NHibernate 基於 ClassMapping 的 ManyToMany(多對多配置) 實體類 public class Library { public virtual

數據庫表設計一對

關系 log 一個 數據庫 inf 對應關系 分享圖片 也有 通過 做一個項目,必然是少不了數據庫設計的!在學習階段,基本都是單表。然而在實際開發過程中,一對多,多對多的表處處都是!簡單整理一下,一對多,多對多表如何設計整理一下思路: 數據庫

spring data jpa關聯查詢一對一、一對

sse eager save net array ota println ack generate   在實際過往的項目中,常用的查詢操作有:1、單表查詢,2、一對一查詢(主表和詳情表)3、一對多查詢(一張主表,多張子表)4、多對多查詢(如權限控制,用戶、角色多對多)。做個

Python筆記18Django之ORM()

方式 The short erro edm 關聯對象 對象的關聯 .site views 一、ManyToManyField 1、class RelatedManager "關聯管理器"是在一對多或者多對多的關聯上下文中使用的管理器。 它存在於下面兩種情況: 外

使用GreenDao建立表、關聯表一對一,一對、CURD、升級資料庫等操作

        應用場景:從照片中找出包含有使用者人臉的照片,並儲存該照片中的人臉特徵、使用該特徵和使用者人臉特徵對比,滿足條件,照片就儲存到該使用者表裡 一、建立表 GreenDao託管地址:https://github.com/greenrobot

hibernate的的關聯 2增加、刪除

重點: 1、級聯新增 inverse屬性值的設定 2、 級聯刪除 重點解析: 1.hibernate的多對多 1.1 hibernate可以直接對映多對多關聯關係(看作兩個一對多) 講解inverse; 總共四種 (false 是控制方 ,true 是被控制方),其中有兩種正確,兩種

資料庫的多對多 1.1 資料庫中不能直接對映多對多 處理:建立一個橋接表(中間表),將一個多對多關係轉換成兩個一對多 注1:資料庫多表聯接查詢 永遠就是二個表的聯接查詢 A B C D t1 C t2 D

【筆記】Mybatis高階查詢--使用resultMap的<collection>標籤實現一對查詢

<collection>集合的巢狀結果對映就是指通過一次SQL查詢將所有的結果查詢出來,然後對映到不同的物件中。在一對多的關係中,主表一條資料會對應關聯表的多條資料。因此一般查詢時會查詢出多條結果,按照一對多的資料對映時,最終的結果數會小於等於查詢的總記錄數。

【Hibernate】Hibernate表操作、配置

1.2 Hibernate的一對多關聯對映 1.2.1 資料庫表與表之間的關係 1.2.1.1 一對多關係 什麼樣關係屬於一對多?   一個部門對應多個員工,一個員工只能屬於某一個部門。 一個客戶對應多個聯絡人,一個聯絡人只能屬於某一個客戶。 一對多的建表原

1

資料庫的多對多 1.1 資料庫中不能直接對映多對多 處理:建立一個橋接表(中間表),將一個多對多關係轉換成兩個一對多 注1:資料庫多表聯接查詢 永遠就是二個表的聯接查詢 A B C D t1 C t2 D

Django框架十二—— 補充:inclusion_tag、defer、only、choice、事務、建立的第三張表

補充:inclusion_tag、defer、only、choice、事務、建立多對多的第三張表 一、inclusion_tag 1、作用 用於生成HTML片段,是資料由引數傳入而變成動態 2、使用 # 1.app下新建一個模組,templatetags # 2.建立一個py檔案(mytag.py)

Hibernate關聯對映一對/

3.  Hibernate關聯對映 上接Hibernate持久化類:https://blog.csdn.net/biggerchong/article/details/84260707 目錄 3.  Hibernate關聯對映 3.1 資料庫

十九Mybatis自關聯查詢

注:程式碼已託管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,專案是mybatis-14-oneself-many2one,需要自取,需要配置maven環境以及mysql環境(sql語句在resource下的test.s

MyBatis學習總結---基於XML表聯合查詢一對一、一對

1、一對一的關聯  使用association,association元素用於處理“has-one”(一對一)這種型別關係。  作用:針對pojo物件屬性的對映,它的兩個主要引數此時對應的值: javaType對應pojo類名,  property對應pojo的