Hibernate从零开始_07_多对多关系(中间表)

    一、Hibernate多对多(中间表含多个字段)的把多对多拆分为两个一对多。实现以下:java

    学生类:session

/**
 * 学生表
 */
public class Student {
 private Long id;
 private String name;
 
 //与学生课程关联表创建一对多关系
 private Set<StudentCourseRelation> scr = new HashSet<StudentCourseRelation>();
 
 public Student() {
 }
 public Long getId() {
  return id;
 }
 public void setId(Long id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public Set<StudentCourseRelation> getScr() {
  return scr;
 }
 public void setScr(Set<StudentCourseRelation> scr) {
  this.scr = scr;
 }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC   
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
 <hibernate-mapping>
  <class name="com.study.hibernate.domain.Student" table="t_student" catalog="db_hibernate">
   <id name="id" column="id" type="java.lang.Long">
    <generator  class="native"></generator>
   </id>
   
   <property name="name" column="name" type="java.lang.String"></property>
   
   
   <set name="scr" cascade="all">
    <key column="student_id"/>
    <one-to-many class="com.study.hibernate.domain.StudentCourseRelation"/>
   </set>
  </class>
 </hibernate-mapping>

    课程类:app

/**
 * 课程
 */
public class Course {
 private Long id;
 private String name;
 
 //与学生课程关联表创建一对多关系
 private Set<StudentCourseRelation> scr = new HashSet<StudentCourseRelation>();
 
 public Course(){
  
 }
 
 public Long getId() {
  return id;
 }
 public void setId(Long id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public Set<StudentCourseRelation> getScr() {
  return scr;
 }
 public void setScr(Set<StudentCourseRelation> scr) {
  this.scr = scr;
 }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC   
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
 <hibernate-mapping>
  <class name="com.study.hibernate.domain.Course" table="t_course" catalog="db_hibernate">
   <id name="id" column="id" type="java.lang.Long">
    <generator  class="native"></generator>
   </id>
   <property name="name" column="name" type="java.lang.String"></property>
   <set name="scr" cascade="all">
    <key column="course_id"/>
    <one-to-many class="com.study.hibernate.domain.StudentCourseRelation"/>
   </set>
  </class>
 </hibernate-mapping>

    学生课程关联类:dom

/**
 * 学生课程关联表
 */
public class StudentCourseRelation {
 private Long id;
 private Long sort;
 private Student students;
 private Course courses;
 
 public Long getId() {
  return id;
 }
 public void setId(Long id) {
  this.id = id;
 }
 
 public Long getSort() {
  return sort;
 }
 public void setSort(Long sort) {
  this.sort = sort;
 }
 public Student getStudents() {
  return students;
 }
 public void setStudents(Student students) {
  this.students = students;
 }
 public Course getCourses() {
  return courses;
 }
 public void setCourses(Course courses) {
  this.courses = courses;
 }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC   
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
 <hibernate-mapping>
  <class name="com.study.hibernate.domain.StudentCourseRelation" table="t_student_course_relation" catalog="db_hibernate">
   <id name="id" column="id" type="java.lang.Long">
    <generator  class="native"></generator>
   </id>
   <property name="sort" column="sort" type="java.lang.Long"></property>
   <many-to-one name="students" class="com.study.hibernate.domain.Student" column="student_id"></many-to-one>
   <many-to-one name="courses" class="com.study.hibernate.domain.Course" column="course_id"></many-to-one>
  </class>
 </hibernate-mapping>

    测试代码:测试

/**
  * 插入数据
  */
 @Test
 public void insertTest(){
  Configuration configuration = new Configuration().configure();
  ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
  SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
  Session session = sessionFactory.openSession();
  Transaction transaction = session.beginTransaction();
  
  Student stu1 = new Student();
  stu1.setName("zhangsan");
  
  Course c1 = new Course();
  c1.setName("English");
  
  session.persist(stu1);
  session.persist(c1);
  
  StudentCourseRelation scr = new StudentCourseRelation();
  scr.setStudents(stu1);
  scr.setCourses(c1);
  session.persist(scr);
  transaction.commit();
  session.close();
  sessionFactory.close();
  
  //结果
//  Hibernate: /* insert com.study.hibernate.domain.Student */ insert into db_hibernate.t_student (name) values (?)
//  Hibernate: /* insert com.study.hibernate.domain.Course */ insert into db_hibernate.t_course (name) values (?)
//  Hibernate: /* insert com.study.hibernate.domain.StudentCourseRelation */ insert into db_hibernate.t_student_course_relation (student_id, course_id) values (?, ?)
 }
 /**
  * 查询数据
  */
 @Test
 public void queryTest(){
  Configuration configuration = new Configuration().configure();
  ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
  SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
  Session session = sessionFactory.openSession();
  Transaction transaction = session.beginTransaction();
  
  
  Student stu = (Student) session.load(Student.class, new Long(2));
  Set<StudentCourseRelation> scr =  stu.getScr();
  for (StudentCourseRelation studentCourseRelation : scr) {
   System.out.println(studentCourseRelation.getCourses().getId());
   System.out.println(studentCourseRelation.getCourses().getName());
  }
  
  
  transaction.commit();
  session.close();
  sessionFactory.close();
 }

    结果:ui

Hibernate: /* load com.study.hibernate.domain.Student */ select student0_.id as id1_1_0_, student0_.name as name2_1_0_ from db_hibernate.t_student student0_ where student0_.id=?
Hibernate: /* load one-to-many com.study.hibernate.domain.Student.scr */ select scr0_.student_id as student_3_1_1_, scr0_.id as id1_2_1_, scr0_.id as id1_2_0_, scr0_.sort as sort2_2_0_, scr0_.student_id as student_3_2_0_, scr0_.course_id as course_i4_2_0_ from db_hibernate.t_student_course_relation scr0_ where scr0_.student_id=?
Hibernate: /* load com.study.hibernate.domain.Course */ select course0_.id as id1_0_0_, course0_.name as name2_0_0_ from db_hibernate.t_course course0_ where course0_.id=?
2:English