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中的程式碼
3、測試類中的程式碼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; } }
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
JPA之JPA中的多對多雙向關聯
如果要搭建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