1. 程式人生 > >jpa雙向多對多關係

jpa雙向多對多關係

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

1  實體的定義

Student表:

package org.lxh.info;

import java.util.*;

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;

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

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

	@Column(length = 50)
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	@ManyToMany(cascade=CascadeType.REFRESH)
	@JoinTable(name="student_teacher",
[email protected]
(name="teacherId"),[email protected](name="stuId")) public Set<Teacher> getTeachers() { return teachers; } public void setTeachers(Set<Teacher> teachers) { this.teachers = teachers; } }

@ManyToMany表示多對多關聯,對於這種關聯極少數情況會使用級聯刪除,我這裡設定的是級聯重新整理;因為有中間表的存在這裡使用@JoinTable來設定關聯表後面的name配置的是關聯表的名稱,inverseJoinColumn配置的是關係被維護一方主鍵對應的中間表字段,joinColumn配置的是關係維護方主鍵對應的中間表字段。這裡是最複雜的地方

Teacher表:

package org.lxh.info;

import java.util.*;

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;
       @Id @GeneratedValue
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}
        @Column(length=50)
	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;
	}
}

到這裡實體就定義完了,要注意的地方就是隻有關係維護的一方才能更新中間表裡的外來鍵記錄。如果反過來則會報錯

2  多對多資料儲存

/**
	 * 雙向多對多儲存
	 */
	@org.junit.Test
	public void testMany2ManyInsert() {
		EntityManager em=null;
		EntityTransaction tx=null;
		try{
			em=JpaUtil.getEntityManager();
			tx=em.getTransaction();
			tx.begin();
			
			Student s=new Student();
			s.setName("張小華");
			Student s2=new Student();
			s2.setName("陳小明");
			Set<Student> students=new HashSet<Student>();
			students.add(s);
			students.add(s2);
			
			Teacher t=new Teacher();
			t.setName("李老師");
			t.setStudents(students);
			
			Teacher t2=new Teacher();
			t2.setName("劉老師");
			t2.setStudents(students);
			
			Set<Teacher> teachers=new HashSet<Teacher>();
			teachers.add(t);
			teachers.add(t2);
			
			s.setTeachers(teachers);
			s2.setTeachers(teachers);
			
			
                        em.persist(s);
                        em.persist(s2);
                        em.persist(t);
                        em.persist(t2);
			
			
		    
			tx.commit();
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(em!=null){
				em.close();
			}
		}
		
	}
儲存操作是比較簡單的,但是如果要刪除或解除關聯關係,就稍顯複雜了,來看這段程式碼
@org.junit.Test
	public void testMany2ManyDelete() {
		EntityManager em=null;
		EntityTransaction tx=null;
		try{
			em=JpaUtil.getEntityManager();
			tx=em.getTransaction();
			tx.begin();
			Student s=em.find(Student.class, 1);
			Student s2=em.find(Student.class, 2);
			Teacher t=em.find(Teacher.class, 2);
			//先解除關聯關係
			s.getTeachers().remove(t);
			s2.getTeachers().remove(t);
			//解除關聯關係後才能通過關係被維護端刪除資料
		    em.remove(t);
			tx.commit();
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(em!=null){
				em.close();
			}
		}
		
	}

最後總結一下使用關聯關係的要點:分清楚關係維護端和關係被維護端、合理的使用註解、級聯的設定根據具體情況指定。

相關推薦

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

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

JPA:對映雙向關聯關係

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

jpa雙向關係

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

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

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

JPA - 雙向對映

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

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

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

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

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

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

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

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

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

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

一、多表關係 1、一對多        一方放棄外來鍵維護,多方來維護,預設雙方都有外來鍵維護權力,一方選擇放棄就行,避免重複更新 提高效能         多方表加入外來鍵欄位,該欄位值和一方表id一致,但外來鍵欄位在實體中並沒有宣告屬性,也就是說多方實體內沒有外來鍵

Hibernate學習(四)———— 雙向對映關係

一、小疑問的解答        問題一:到這裡,有很多學習者會感到困惑,因為他不知道使用hibernate是不是需要自己去建立表,還是hibernate全自動,如果需要自己建立表,那麼主外來鍵這種設定也是自己設定嗎?這讓人感到很困惑,現在就來解決一下這個小疑問(如果知道了的可以直接跳過看下面的多對多對映關係

Hibernate基於主鍵的單項,雙向對映關係

今天我們來一起談論下hibernate的基於主鍵的單項,雙向多對多對映關係 首先多對多都是基於主鍵的,沒有基於外來鍵的說法 1.基於主鍵的單項多對多 在這裡就是說中間stuobject是一張關係表,將兩張表的主鍵進行關聯,形成了多對多的關係 程式碼如

Hibernate關聯關係配置-----基於連線表的雙向配置

實體:package bi.many2many.jointable; import java.util.HashSet; import java.util.Set; public class Student { private int id; private Stri

JPAJPA中的雙向關聯

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

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

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

hibernate雙向關系映射的級聯配置

hibernate多對多雙向關系映級配置多對多關系映射 set元素的屬性:cascade:級聯操作。取值:save-update:級聯保存更新delete:級聯刪除。 註意:在多對多雙向關系映射中,不能配置雙向級聯刪除。但是可以配置雙向級聯保存更新。 <set name=&q

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

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