Hibernate的注解开发之数据的三种关系介绍,表结构多对多

来源:互联网 发布:手机模拟吉他软件 编辑:程序博客网 时间:2024/05/17 08:58


表结构多对多

对于表结构的多对多关系,我们在实际开发中使用也非常多,

所以我也简单介绍个使用注解开发时的多对多关系案例


描述学生和老师之间的关系

一个学生会有多个老师教导

一个老师会给多个学生上课


首先配置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 {@Testpublic 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();}}

测试结果:

学生表



老师表



中间表







0 0
原创粉丝点击