表结构多对多
对于表结构的多对多关系,我们在实际开发中使用也非常多,
所以我也简单介绍个使用注解开发时的多对多关系案例
描述学生和老师之间的关系
一个学生会有多个老师教导
一个老师会给多个学生上课
首先配置hibernate的核心配置文件
hibernate.cfg.xml
<mapping class="cn.itheima.manytomany.Teacher" />
<mapping class="cn.itheima.manytomany.Student" />
学生类
Student.java
package cn.itheima.manytomany; import java.util.HashSet; import java.util.Set; 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; import javax.persistence.Table; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.CascadeType; @Entity//ORM实体 @Table(name = "t_student")//对应表 public class Student { @Id//主键 @GeneratedValue(strategy = GenerationType.IDENTITY)//主键生成策略 private Integer id; private String name;//如果不指定,默认也是回到表中的字段的,属性名将作为字段名 //多对多 @ManyToMany(targetEntity = Teacher.class) // 使用joinTab来描述中间表,并描述中间表中外键与student,teacher的映射关系 //描述中间表名student_teacher //两个字段名c_student_id,c_teacher_id,注意当前类是学生类,所以joinColumns里的字段名写的是对应学生表的字段名 @JoinTable(name = "student_teacher", joinColumns = { @JoinColumn(name = "c_student_id") }, inverseJoinColumns = {@JoinColumn(name = "c_teacher_id") }) //级联保存 @Cascade(CascadeType.SAVE_UPDATE) private Set<Teacher> teacher = new HashSet<>(); public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Teacher> getTeacher() { return teacher; } public void setTeacher(Set<Teacher> teacher) { this.teacher = teacher; } }
老师类
Teacher.java
package cn.itheima.manytomany; import java.util.HashSet; import java.util.Set; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToMany; import javax.persistence.Table; @Entity//描述实体 @Table(name="t_teacher")//对应表 public class Teacher { @Id//主键 @GeneratedValue(strategy=GenerationType.IDENTITY)//主键的生成策略 private Integer id; private String name; //多对多关系 @ManyToMany(mappedBy="teacher")//当前表放弃外键维护,这样只有学生表进行外键维护 private Set<Student> student = new HashSet<>(); public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Student> getStudent() { return student; } public void setStudent(Set<Student> student) { this.student = student; } }
测试类StudentTeacherTest.java
package cn.itheima.manytomany; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test; import cn.itheima.utils.HibernateUtils; /** * 测试类 * @author admin * */ public class StudentTeacherTest { @Test public void test1(){ Session session = HibernateUtils.getSession(); Transaction transaction = session.beginTransaction(); Student stu1 = new Student(); stu1.setName("小明"); Student stu2 = new Student(); stu2.setName("小红"); Teacher tea1 = new Teacher(); tea1.setName("张良"); Teacher tea2 = new Teacher(); tea2.setName("荀子"); stu1.getTeacher().add(tea1); stu1.getTeacher().add(tea2); stu2.getTeacher().add(tea1); stu2.getTeacher().add(tea2); session.save(stu1); session.save(stu2); transaction.commit(); session.close(); } }
测试结果:学生表
老师表
中间表