Hibernate学习8—Hibernate 映射关系(多对多)
package com.cy.model; import java.util.HashSet;
import java.util.Set; public class Student {
private int id;
private String name;
private Set<Course> courses = new HashSet<Course>(); public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Course> getCourses() {
return courses;
}
public void setCourses(Set<Course> courses) {
this.courses = courses;
} }
Course.java:
package com.cy.model;
public class Course {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Student.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.cy.model"> <class name="Student" table="t_student">
<id name="id" column="studentId">
<generator class="native"></generator>
</id>
<property name="name" column="studentName"></property> <!-- 多对多没法用两个表来实现,必须借助第三张表,中间表(student_course)
key column="student_id"表示学生课程表中的一个外键student_id关联学生表的主键
-->
<set name="courses" table="student_course" cascade="save-update">
<key column="student_id"></key>
<!-- many to many映射的另外一张表
student_course的外键course_id关联course表的主键
-->
<many-to-many class="com.cy.model.Course" column="course_id"></many-to-many>
</set>
</class> </hibernate-mapping>
Course.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.cy.model"> <class name="Course" table="t_course">
<id name="id" column="courseId">
<generator class="native"></generator>
</id>
<property name="name" column="courseName"></property>
</class> </hibernate-mapping>
测试代码:
StudentTest.java:
package com.cy.service; import java.util.Set; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import com.cy.model.Course;
import com.cy.model.Student;
import com.cy.util.HibernateUtil; public class StudentTest { private SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
private Session session; @Before
public void setUp() throws Exception {
session=sessionFactory.openSession();
session.beginTransaction();
} @After
public void tearDown() throws Exception {
session.getTransaction().commit();
session.close();
} @Test
public void testSave1(){
Course course1=new Course();
course1.setName("语文"); Course course2=new Course();
course2.setName("数学"); Student student1=new Student();
student1.setName("张三");
student1.getCourses().add(course1);
student1.getCourses().add(course2); Student student2=new Student();
student2.setName("李四");
student2.getCourses().add(course1);
student2.getCourses().add(course2); session.save(student1);
session.save(student2);
} /**
* 获取张三选修的课程
*/
@Test
public void testLoad1(){
Student s = (Student) session.get(Student.class, 1);
Set<Course> courses = s.getCourses();
for(Course course : courses) {
System.out.println(course.getName());
}
}
}
查看生成的表结构:

student_course的建表语句:

插入数据后:
t_student:

t_course:

student_course:

2,多对多双向实现:
Student2.java:
package com.cy.model; import java.util.HashSet;
import java.util.Set; public class Student2 {
private int id;
private String name;
private Set<Course2> courses = new HashSet<Course2>(); public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Course2> getCourses() {
return courses;
}
public void setCourses(Set<Course2> courses) {
this.courses = courses;
} }
Course2.java:
package com.cy.model; import java.util.HashSet;
import java.util.Set; public class Course2 {
private int id;
private String name;
private Set<Student2> students = new HashSet<Student2>(); public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Student2> getStudents() {
return students;
}
public void setStudents(Set<Student2> students) {
this.students = students;
} }
Student2.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.cy.model"> <class name="Student2" table="t_student2">
<id name="id" column="studentId">
<generator class="native"></generator>
</id>
<property name="name" column="studentName"></property> <set name="courses" table="student_course2" cascade="save-update">
<key column="student_id"></key>
<many-to-many class="com.cy.model.Course2" column="course_id"></many-to-many>
</set>
</class> </hibernate-mapping>
Course2.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.cy.model"> <class name="Course2" table="t_course2">
<id name="id" column="courseId">
<generator class="native"></generator>
</id>
<property name="name" column="courseName"></property> <!-- inverse=true: 在双向关系中,由学生端来维护关联关系 -->
<set name="students" table="student_course2" inverse="true">
<key column="course_id"></key>
<many-to-many class="com.cy.model.Student2" column="student_id"></many-to-many>
</set>
</class> </hibernate-mapping>
测试代码:
@Test
public void testSave2(){
Course2 course1=new Course2();
course1.setName("语文"); Course2 course2=new Course2();
course2.setName("数学"); Student2 student1=new Student2();
student1.setName("张三");
student1.getCourses().add(course1);
student1.getCourses().add(course2); Student2 student2=new Student2();
student2.setName("李四");
student2.getCourses().add(course1);
student2.getCourses().add(course2); session.save(student1);
session.save(student2);
} /**
* 获取选修 语文 这门课的学生
*/
@Test
public void testLoad2(){
Course2 course = (Course2) session.get(Course2.class, 1);
Iterator<Student2> students = course.getStudents().iterator();
while(students.hasNext()){
Student2 s = students.next();
System.out.println(s.getName());
}
}
查看生成的表结构:

表的结构、插入后的数据,都和单向关系中创建的一模一样;
区别就是,现在可以从课程获取到选修这门课程的学生了。
Hibernate学习8—Hibernate 映射关系(多对多)的更多相关文章
- Hibernate中的一对一映射关系
Hibernate中的一对一映射关系有两种实现方法(单向一对一,和双向一对一)(一对一关系:例如一个department只能有一个manager) 单向和双向有什么区别呢??例如若是单向一对一,比如在 ...
- Hibernate学习(四)———— 双向多对多映射关系
一.小疑问的解答 问题一:到这里,有很多学习者会感到困惑,因为他不知道使用hibernate是不是需要自己去创建表,还是hibernate全自动,如果需要自己创建表,那么主外键这种设置也是自己设置吗? ...
- [原创]java WEB学习笔记86:Hibernate学习之路-- -映射 n-n 关系,单向n-n,双向n-n
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记85:Hibernate学习之路-- -映射 一对一关系 ,基于主键方式实现
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记84:Hibernate学习之路-- -映射 一对一关系 ,基外键的方式实现
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Hibernate学习(五)Hibernate 多对多映射
说到多对多关系,印象最深刻的就是大学的选修课.一个学生可以选修多门课程,一门课程可以有多个学生选修,学生所选的每一门课程还有成绩.这个场景的E-R图如下: 对于多对多的关系,我们通常会抽出一张中间表( ...
- Hibernate学习8—Hibernate 映射关系(一对一)
第一节:Hibernate 一对一映射关系实现 假设一个用户对应一个地址: 1)按照主键映射: User.java: package com.cy.model; public class User ...
- [原创]java WEB学习笔记82:Hibernate学习之路---映射 一对多关联关系,配置,CRUD方法测试及注意点
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
随机推荐
- bzoj4945
题解: 一眼看过去还以为是3-sat 其实d只有8 那么我们可以枚举每一个x选择哪一个 然后再用2-sat处理 代码: #include<bits/stdc++.h> using name ...
- for循环打印等腰三角形、直角三角形、菱形
一.等腰三角形 package s1; import java.util.Scanner; public class C31 { public static void main(String[] ar ...
- python marshal 对象序列化和反序列化
有时候,要把内存中的一个对象持久化保存到磁盘上,或者序列化成二进制流通过网络发送到远程主机上.Python中有很多模块提供了序列化与反序列化的功能,如:marshal, pickle, cPickle ...
- Android程序员学WEB前端(8)-CSS(3)-盒子内联块级定位浮动-Sublime
转载请注明出处:http://blog.csdn.net/iwanghang/article/details/76618473 觉得博文有用,请点赞,请评论,请关注,谢谢!~ 盒子模型: <!D ...
- js之侧边栏分享
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- CSS同时使用背景图片和背景颜色
background:url(../images/bg.jpg) #F3EFE5 no-repeat ;
- 转载 vi替换windows换行符为linux换行符
1.用vi打开指定文本文件:vi filename.c 2.按 Esc 键,进入命令模式: 3.按 : 键 (按 Shift 键不放后,同时按 : 键)进入命令输入状态: 4.在冒号后输入:%s/^M ...
- Form表单如何传递List数组对象到后台的解决办法(转)
举例说明: [后台有一个对象 User 一个PhotoDo对象],结构如下: public class User{ private String username; private List&l ...
- sssp-springmvc+spring+spring-data-jpa问题总结
问题:Caused by: java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to re ...
- BZOJ4237 稻草人 【CDQ分治】
Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要 ...