1. 程式人生 > >JPA之JPA中的多對多雙向關聯

JPA之JPA中的多對多雙向關聯

如果要搭建JPA開發環境,請從JPA第一篇部落格看起。

下面的例子以老師和學生的例子進行多對多關係的編碼講解。

1、Student.java中的程式碼

package cn.sunft.bean;

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

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;

/**
 * 學生
 */
@Entity
public class Student {
	private Integer id;
	private String name;
	private Set<Teacher> teachers = new HashSet<>();

	public Student() {
		super();
	}

	public Student(String name) {
		super();
		this.name = name;
	}

	@Id
	@GeneratedValue
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	@Column(length = 10, nullable = false)
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	//維護關係的一方
	@ManyToMany(cascade=CascadeType.REFRESH)
	//如果中間表不寫inverseJoinColumns和joinColumns屬性,
	//Hibernate會自動生成對應的中間表的外來鍵
	@JoinTable(name="student_teacher", 
		
[email protected]
(name="teacher_id"), [email protected](name="student_id"))//指定關聯的中間表 public Set<Teacher> getTeachers() { return teachers; } public void setTeachers(Set<Teacher> teachers) { this.teachers = teachers; } public void addTeacher(Teacher teacher){ this.teachers.add(teacher); } public void removeTeacher(Teacher teacher){ if(this.teachers.contains(teacher)){ this.teachers.remove(teacher); } } //重寫hashCode方法,用於判斷兩個物件是否相等 @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Student other = (Student) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } }

2、Teacher.java中的程式碼
package cn.sunft.bean;

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

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;

/**
 * 老師
 */
@Entity
public class Teacher {
	private Integer id;
	private String name;
	private Set<Student> students = new HashSet<>();

	public Teacher() {
		super();
	}

	public Teacher(String name) {
		super();
		this.name = name;
	}

	@Id
	@GeneratedValue
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	@Column(length = 10, nullable = false)
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	//多對多關係中,級聯刪除基本用不上,這裡預設是懶載入
	//被維護關係的一方
	@ManyToMany(cascade=CascadeType.REFRESH, mappedBy="teachers")
	public Set<Student> getStudents() {
		return students;
	}

	public void setStudents(Set<Student> students) {
		this.students = students;
	}

}
3、測試類中的程式碼
package junit.test;

import javax.persistence.CascadeType;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.junit.Test;

import cn.sunft.bean.Student;
import cn.sunft.bean.Teacher;

/**
 * 多對多的測試
 */
public class ManyToManyTest {
	
	/**
	 * 儲存學生和老師
	 */
	@Test
	public void save(){
		EntityManagerFactory factory 
			= Persistence.createEntityManagerFactory("sunft_first");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		em.persist(new Student("小張"));
		em.persist(new Teacher("李勇老師"));
		em.getTransaction().commit();
		em.close();
		factory.close();
	}
	
	/**
	 * 建立老師和學生的關係
	 */
	@Test
	public void buildTS(){
		EntityManagerFactory factory 
			= Persistence.createEntityManagerFactory("sunft_first");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		//這裡的配置是學生負責維護關係
		Student student = em.find(Student.class, 31);
		//這裡並不需要把老師及時載入進來,體現在中間表中新增一條資料
		student.addTeacher(em.getReference(Teacher.class, 32));
		em.getTransaction().commit();
		em.close();
		factory.close();
	}
	
	/**
	 * 解除老師和學生的關係
	 */
	@Test
	public void deleteTS(){
		EntityManagerFactory factory 
			= Persistence.createEntityManagerFactory("sunft_first");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		//這裡配置的是學生負責維護關係
		Student student = em.find(Student.class, 25);
		//這裡並不需要把老師及時載入進來,使用getReference增加效能,
		//體現在將中間表中的記錄刪除一條
		student.removeTeacher(em.getReference(Teacher.class, 26));
		em.getTransaction().commit();
		em.close();
		factory.close();
	}
	
	/**
	 * 刪除老師:只能先解除和學生的關係,再刪除老師,
	 * 老師是關係被維護端,沒有權利級聯刪除關係
	 */
	@Test
	public void deleteTeacher(){
		EntityManagerFactory factory 
			= Persistence.createEntityManagerFactory("sunft_first");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		Student student = em.find(Student.class, 25);
		Teacher teacher = em.getReference(Teacher.class, 26);
		//這裡並不需要把老師及時載入進來,體現在將中間表中的記錄刪除一條
		student.removeTeacher(teacher);//解除關係
		em.remove(em.getReference(Teacher.class, 26));//刪除老師
		em.getTransaction().commit();
		em.close();
		factory.close();
	}
	
	/**
	 * 刪除學生:因為由學生維護關係,因此刪除學生會刪除關係,
	 * 但是隻有當cascade=CascadeType.REMOVE時,才會連著
	 * 學生一起刪除
	 */
	@Test
	public void deleteStudent(){
		EntityManagerFactory factory 
			= Persistence.createEntityManagerFactory("sunft_first");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		Student student = em.getReference(Student.class, 31);
		//這裡會刪除關係
		em.remove(student);//刪除老師
		em.getTransaction().commit();
		em.close();
		factory.close();
	}
}



相關推薦

Hibernate,關係對映的一單向關聯雙向關聯、一對一主鍵關聯、一對一外來鍵關聯關係關聯

2018-11-10  22:27:02開始寫   下圖內容ORM、Hibernate介紹、hibername.cfg.xml結構:     下圖內容hibernate對映檔案結構介紹   下圖內容hibernate

Hibernate,關系映射的一單向關聯雙向關聯、一對一主鍵關聯、一對一外鍵關聯關系關聯

nat 延遲加載 alt ima orm 雙向關聯 映射文件 結構 spa 2018-11-10 22:27:02開始寫 下圖內容ORM、Hibernate介紹、hibername.cfg.xml結構: 下圖內容hibernate映射文件結構介紹

一對/雙向關聯

第一步:在資料庫裡建兩張表,例如:一張表名是CLASS 有STUDENTCLASSID,STUDENTCLASSNAME,另一張表名是STUDENT 有 STUDENTID,STUDENTCLASSID,STUDENTNAME,第二步:建立兩個PO物件,Class ,Stud

JPAJPA雙向關聯

如果要搭建JPA開發環境,請從JPA第一篇部落格看起。 下面的例子以老師和學生的例子進行多對多關係的編碼講解。 1、Student.java中的程式碼 package cn.sunft.bean; import java.util.HashSet; import j

JPA - 雙向對映

在雙向多對多關係中,我們必須指定一個關係維護端(owner side),可以通過 @ManyToMany 註釋中指定 mappedBy 屬性來標識其為關係維護端。 【1】item與Category item:category = N:N ,item為關係維護端(主),catego

JPA表關係的刪除操作,如何刪除放棄維護關聯關係的一方和中間表的紀錄

資料庫中的表 使用者表:在配置實體類的時候放棄了維護關聯關係的權利 角色表: 中間表: 需求:刪除t_user表中的user_id 為1的使用者,並刪除相關的中間表紀錄。 程式碼: @Test public

JPA學習筆記(10)——對映雙向關聯關係

                     多對多關聯比如現在有兩個實體類:1. Product(商品)2. Category(類別)一個商品可以有多個類別,一個類別也可以有多個商品,這就形成了多對多的關係Productpackage com.jpa.helloworld2;import java.util.L

JPA表關係的刪除操作,如何只刪除一方和中間表的紀錄

資料庫中的表 使用者表: 角色表: 中間表: 需求:刪除t_user表中的user_id 為1的使用者,並刪除相關的中間表紀錄。 程式碼: @Test public void testRemove() {

JPA:對映雙向關聯關係

.在雙向多對多關係中,我們必須指定一個關係維護端(owner side),可以通過@ManyToMany註釋中指定 mappedBy屬性來標識其為關係維護端 1.這裡用商品(Item)和類別(Category)舉例子,一個商品可以對應多個種類,而一個種類也可以對應多個商品

jpa雙向關係

多對多關係相比其他其中關聯關係,顯得稍微複雜了一點點,這個複雜度主要體現在對這種關聯關係的理解上。和其他關聯關係不同的是這種關聯多出來了一張中間表,操作上多了些許複雜,來隨便看下吧 1  實體的定義 Student表: package org.lxh.info; impo

9、JPA-映射-雙向

cto map before mit fin ima 懶加載 span init 實體類 Category package com.jpa.yingshe; import java.util.HashSet; import java.util.Set; import

JPA對映關係詳細說明(一對一,一對一、)、@JoinColumn、mappedBy說明

JPA中的對映關係 jpa中維護one to one ,one to many, many to one ,many to many 四種對映關係。       在每個關係中,雙方中的一方在其表中擁有連線列。那麼一方稱為所有方(owning side) 或者關係的所有者。

hibernate的映射四(雙向關聯)

als oot bean odi 生成 指定 數據庫方言 映射文件 格式化sql Many-to-Many 多對多的映射可以使用一組Java集合不包含任何重復的元素來實現。我們已經看到了Hibernate如何設置映射集合。 集(SET)被映射到與映射表中<set&g

JPA一單向關聯

單向關聯 com 使用 gpo false jpa log post 關聯 在實際開發過程中,JPA多對一單向關聯是使用最多的關聯方式。 下面是訂單與訂單項的配置關系。 訂單(Order):一的一方,不進行任何配置 @Entity @Table(name

JPA

ren ref sid amp dia .com pos idt 圖片 ? 在雙向多對多關系中,我們必須指定一個關系維護端(owner side),可以通過 @ManyToMany 註釋中指定 mappedBy 屬性來標識其為關系維護端。 @ManyToMany @Jo

JPA(五):映射關聯關系------映射單向一的關聯關系

span AS 127.0.0.1 mysql5 單向 cti isa 嘗試 sequence 映射單向多對一的關聯關系 新建Customer.java: package com.dx.jpa.singlemanytoone; import java.ut

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

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

JPA關聯關係(一、一對、一對一)

小提示:外來鍵在哪邊,那邊就是多方哦!! 單向多對一:   給多方加上 @ManyToOne ex:【產品類Product--多方 ,產品分類ProductDir--一方】 單向一對多:給一方加上 @OneToMany ex

jpa表關係 一對 一對一 註解怎麼寫

一、多表關係 1、一對多        一方放棄外來鍵維護,多方來維護,預設雙方都有外來鍵維護權力,一方選擇放棄就行,避免重複更新 提高效能         多方表加入外來鍵欄位,該欄位值和一方

基於註解的Hibernate JPA操作CRUD(單表、一對

0.maven引入相關依賴資源 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/200