JPA多対多@manytomany注記構成例
11993 ワード
メンテナンス側コメント
保守側コメント
リレーショナル・メンテナンス・エンドが削除されると、中間テーブルにレコードの関連情報が存在する場合、その関連情報が削除されます.
関係が保守側によって削除する場合、中間テーブルに記録された関連情報がある場合、削除に失敗する.
学生と先生の対応関係を例にとります.1人の学生は複数の先生を持つことができ、1人の先生も複数の学生を持つことができる.
学生エンティティクラス
Student.JAvaコード
ポイント:
Teacher.JAvaコード
ポイント:
mappedBy注釈を持つエンティティクラスは、リレーショナルが保持される側であり、他のエンティティクラスはリレーショナルが保持される側である.その名の通り、関係の維持端対関係(多対多は中間関連テーブル)のCRUDを操作する.関係の被メンテナンス側はこの操作がなく、関係をメンテナンスできません.
@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を操作する.関係の被メンテナンス側はこの操作がなく、関係をメンテナンスできません.