JPA多對多@manytomany注解配置實例


維護端注解

@ManyToMany (cascade = CascadeType.REFRESH)

@JoinTable (//關聯表

name = "student_teacher" , //關聯表名

inverseJoinColumns = @JoinColumn (name = "teacher_id" ),//被維護端外鍵

joinColumns = @JoinColumn (name = "student_id" ))//維護端外鍵

  

被維護端注解

@ManyToMany(

cascade = CascadeType.REFRESH,

mappedBy = "teachers",//通過維護端的屬性關聯

fetch = FetchType.LAZY)

 

關系維護端刪除時,如果中間表存在些紀錄的關聯信息,則會刪除該關聯信息;

關系被維護端刪除時,如果中間表存在些紀錄的關聯信息,則會刪除失敗 .

 

以學生和老師的對應關系為例。一個學生可以擁有多個老師,一個老師也可以擁有多個學生。

學生實體類

Student.java代碼

package com.taoistwar.jpa.entity.manytomany; 

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.GenerationType; 
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 teachers = new HashSet(); 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
public Integer getId() { 
return id; 
} 

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

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

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

@ManyToMany(cascade = CascadeType.REFRESH) 
@JoinTable(name = "student_teacher", inverseJoinColumns = @JoinColumn(name = "teacher_id"), joinColumns = @JoinColumn(name = "student_id")) 
public Set getTeachers() { 
return teachers; 
} 

public void setTeachers(Set teachers) { 
this.teachers = teachers; 
} 

public void addTeacher(Teacher teacher) { 
this.teachers.add(teacher); 
} 

public void removeTeachers(Teacher teacher) { 
this.teachers.remove(teacher); 
} 

} 

重點在於:

@ManyToMany(cascade = CascadeType.REFRESH) 
@JoinTable(name = "student_teacher", inverseJoinColumns = @JoinColumn(name = "teacher_id"), joinColumns = @JoinColumn(name = "student_id")) 
public Set getTeachers() { 
return teachers; 
} 

Teacher.java代碼

package com.taoistwar.jpa.entity.manytomany; 

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

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

@Entity 
public class Teacher { 
private Integer id; 
private String name; 
private Set students = new HashSet(); 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
public Integer getId() { 
return id; 
} 

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

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

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

@ManyToMany(cascade = CascadeType.REFRESH, mappedBy = "teachers", fetch = FetchType.LAZY) 
public Set getStudents() { 
return students; 
} 

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

@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; 
Teacher other = (Teacher) obj; 
if (id == null) { 
if (other.id != null) 
return false; 
} else if (!id.equals(other.id)) 
return false; 
return true; 
} 
} 

重點在於:

@ManyToMany(cascade = CascadeType.REFRESH, mappedBy = "teachers", fetch = FetchType.LAZY) 
public Set getStudents() { 
return students; 
} 

擁有mappedBy注解的實體類為關系被維護端,另外的實體類為關系維護端的。顧名思意,關系的維護端對關系(在多對多為中間關聯表)的CRUD做操作。關系的被維護端沒有該操作,不能維護關系。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM