多对多映射采取中间表连接的映射策略,建立的中间表将分别引入两边的主键作为外键
Many
import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import org.hibernate.annotations.GenericGenerator; @Entity public class Teacher implements java.io.Serializable { private Integer teacherid; private String name; private Set<Student> students = new HashSet<Student>(); @Id @GeneratedValue(generator = "TeacherGenerator") @GenericGenerator(name = "TeacherGenerator", strategy = "native") public Integer getTeacherid() { return teacherid; } public void setTeacherid(Integer teacherid) { this.teacherid = teacherid; } @Column(name = "name", nullable = false, length = 32) public String getName() { return name; } public void setName(String name) { this.name = name; } // @ManyToMany表示Teacher是多对多关系的一端 // @JoinTable描述了多对多关系的数据表关系: name(中间表名称),joinColumns(中间表与Teacher表的外键关系), // inverseJoinColumns(中间表与另外一端(Student)的外键关系) // 中间表的Teacher_ID外键指向Teacher的主键teacherid // 中间表的Student_ID外键指向Student的主键studentid @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY) @JoinTable(name = "Teacher_Student", joinColumns = { @JoinColumn(name = "Teacher_ID", referencedColumnName = "teacherid") }, inverseJoinColumns = { @JoinColumn(name = "Student_ID", referencedColumnName = "studentid") }) public Set<Student> getStudents() { return students; } public void setStudents(Set<Student> students) { this.students = students; } }
Many
import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToMany; @Entity public class Student implements java.io.Serializable { private Integer studentid; private String name; private Set<Teacher> teachers = new HashSet<Teacher>(); @Id @GeneratedValue(strategy = GenerationType.AUTO) public Integer getStudentid() { return studentid; } public void setStudentid(Integer studentid) { this.studentid = studentid; } @Column(name = "student_name", nullable = false, length = 32) public String getName() { return name; } public void setName(String name) { this.name = name; } // @ManyToMany表示Student是多对多关系的一边 // 使用mappedBy属性将维护端交由另外一端(Teacher) @ManyToMany(mappedBy = "students") public Set<Teacher> getTeachers() { return teachers; } public void setTeachers(Set<Teacher> teachers) { this.teachers = teachers; } }
删除学生,因为学生不是关系维护者,所以需先手工解除老师与学生的关联,然后再删除学生
删除老师,因为老师是关系维护者,所以可直接解除老师与学生的关系,不用手工解除
时间: 2024-10-10 11:16:27