一、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