@ManyToMany中间表附加字段设计

时间:2023-03-09 06:01:01
@ManyToMany中间表附加字段设计

在使用@ManyToMany时,若中间表只有相应的外键字段可以直接建立两个对应的Entity 设置ManyToMany

@ManyToMany 两个表多对多关联

但若是中间表有自己的附加字段,这需要为中间表建立Entity

具体如下:

Teacher <=> Student 中间表 teacher_student 附加字段 id(自增),siteId(站点id方便批删除)

增加 Teacher <=> Student 关联时,增加新的TeacherStudent

Entity:

@Entity
@Table(name = "teacher")
public class Teacher { @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; @Column(name = "name")
private String name; @Column(name = "age")
private int age; @ManyToMany(cascade = CascadeType.PERSIST, fetch=FetchType.LAZY)
@JoinTable(name="teacher_student",joinColumns={@JoinColumn(name="tid")},inverseJoinColumns={@JoinColumn(name="sid")})
private Set<Student> students; @OneToMany(mappedBy="teacher", fetch = FetchType.LAZY)
private Set<TeacherStudent> teacherStudents; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Set<Student> getStudents() {
return students;
} public void setStudents(Set<Student> students) {
this.students = students;
} public Set<TeacherStudent> getTeacherStudents() {
return teacherStudents;
} public void setTeacherStudents(Set<TeacherStudent> teacherStudents) {
this.teacherStudents = teacherStudents;
}
}
@Entity
@Table(name = "student")
public class Student { @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; @Column(name = "name")
private String name; @Column(name = "age")
private int age; @ManyToMany(cascade = CascadeType.PERSIST, fetch=FetchType.LAZY)
@JoinTable(name="teacher_student", joinColumns={@JoinColumn(name="sid")}, inverseJoinColumns={@JoinColumn(name="tid")})
private Set<Teacher> teachers; @OneToMany(mappedBy="student", fetch = FetchType.LAZY)
private Set<TeacherStudent> teacherStudents; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Set<Teacher> getTeachers() {
return teachers;
} public void setTeachers(Set<Teacher> teachers) {
this.teachers = teachers;
} public Set<TeacherStudent> getTeacherStudents() {
return teacherStudents;
} public void setTeacherStudents(Set<TeacherStudent> teacherStudents) {
this.teacherStudents = teacherStudents;
}
}

中间表

@Entity
@Table(name = "teacher_student")
public class TeacherStudent { @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; @ManyToOne(fetch = FetchType.LAZY)
@Cascade(value = CascadeType.SAVE_UPDATE)
@JoinColumn(name="tid")
private Teacher teacher; @ManyToOne(fetch = FetchType.LAZY)
@Cascade(value = CascadeType.SAVE_UPDATE)
@JoinColumn(name="sid")
private Student student; @JoinColumn
private int siteId; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public Teacher getTeacher() {
return teacher;
} public void setTeacher(Teacher teacher) {
this.teacher = teacher;
} public Student getStudent() {
return student;
} public void setStudent(Student student) {
this.student = student;
} public int getSiteId() {
return siteId;
} public void setSiteId(int siteId) {
this.siteId = siteId;
}
}