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

維護端註解java

@ManyToMany (cascade = CascadeType.REFRESH)

@JoinTable (//關聯表

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

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

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

  

被維護端註解app

@ManyToMany(

cascade = CascadeType.REFRESH,

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

fetch = FetchType.LAZY)

 

關係維護端刪除時,若是中間表存在些紀錄的關聯信息,則會刪除該關聯信息;ide

關係被維護端刪除時,若是中間表存在些紀錄的關聯信息,則會刪除失敗 .fetch

 

以學生和老師的對應關係爲例。一個學生能夠擁有多個老師,一個老師也能夠擁有多個學生。this

學生實體類spa

Student.java代碼code

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); 
} 

} 

重點在於:blog

@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代碼rem

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; 
} 
} 

重點在於:get

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

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

相關文章
相關標籤/搜索