JPA多対多@manytomany注記構成例

11993 ワード

メンテナンス側コメント
@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)

 
リレーショナル・メンテナンス・エンドが削除されると、中間テーブルにレコードの関連情報が存在する場合、その関連情報が削除されます.
関係が保守側によって削除する場合、中間テーブルに記録された関連情報がある場合、削除に失敗する.
 
学生と先生の対応関係を例にとります.1人の学生は複数の先生を持つことができ、1人の先生も複数の学生を持つことができる.
学生エンティティクラス
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を操作する.関係の被メンテナンス側はこの操作がなく、関係をメンテナンスできません.