以学生[Student ]与课程[Course ]之间的关系为例:

 //Course .java

 public class Course implements Serializable {
private long cid;
private String cname;
private String cdesc;
private Set<Student> students;
//get与set
}
//Student.java
1 public class Student implements Serializable {
private Long sid;
private String sname;
private String sdesc;
private Set<Course> courses;
//get与set }

 Course.hbm.xml

 <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.test.test.Course">
<id name="cid" type="java.lang.Long" length="5">
<column name="cid"></column>
<generator class="increment"></generator>
</id>
<property name="cname" type="java.lang.String" length="20"></property>
<property name="cdesc" type="java.lang.String" length="50"></property>
<!--
table 指的是多对多的第三张表
-->
<set name="students" table="Course_Student" cascade="save-update" inverse="true">
<key>
<column name="cid"></column>
</key>
<many-to-many class="cn.test.test.Student" column="sid">
</many-to-many>
</set>
</class>
</hibernate-mapping>

 Student.hbm.xml

 <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.test.test.Student">
<id name="sid" type="java.lang.Long" length="5">
<column name="sid"></column>
<generator class="increment"></generator>
</id>
<property name="sname" type="java.lang.String" length="20"></property>
<property name="sdesc" type="java.lang.String" length="50"></property>
<set name="courses" table="Course_Student" cascade="save-update" >
<key>
<column name="sid"></column>
</key>
<many-to-many class="cn.test.test.Course" column="cid">
</many-to-many>
</set>
</class>
</hibernate-mapping>
 package cn.test.test;

 import java.util.HashSet;
import java.util.Set; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test; public class DoTest {
private static SessionFactory sessionFactory;
static{
Configuration configuration=new Configuration();
configuration.configure();
sessionFactory=configuration.buildSessionFactory();
} /**
* 1、保存课程
* 2、保存学生
* 3、保存课程的时候同时保存学生
* 4、保存课程的时候同时保存学生,并且建立课程和学生之间的关系
* 5、已经存在一个课程,新建一个学生,并且建立该学生和该课程之间的关系
* 6、已经存在一个学生,新建一个课程,并且建立该学生和该课程之间的关系
* 7、已经存在一个学生,已经存在一个课程,解除该学生和原来课程之间的关系,建立该学生和新课程之间的关系
* 8、已经存在一个学生,解除该学生和该学生的所有的课程之间的关系
* 9、解除该课程和所有的学生之间的关系,再重新建立该课程和一些新的学员之间的关系
* 10、解除该课程和所有的学生之间的关系
* 11、删除课程
* *
* * 解除该班级和所有的学生之间的关系
* * 删除该班级
* *
* 删除班级的同时删除学生
* 12、删除学生
* 同删除班级
*
*/ //1、保存课程
@Test
public void testSaveCourse(){
Session session =sessionFactory.openSession();
Transaction transaction=session.beginTransaction(); Course course=new Course();
course.setCname("java基础");
course.setCdesc("21天精通java基础");
session.save(course); transaction.commit();
session.close();
} //2、保存学生
@Test
public void testSaveStudent(){
Session session=sessionFactory.openSession();
Transaction transaction=session.beginTransaction(); Student student=new Student();
student.setSname("张三");
student.setSdesc("张四他哥,就是这么的霸气");
session.save(student); transaction.commit();
session.close();
} //3、保存课程的时候同时保存学生
@Test
public void testSaveCourse_Student(){
Session session =sessionFactory.openSession();
Transaction transaction=session.beginTransaction(); Course course=new Course();
course.setCname("Net 基础");
course.setCdesc("学习完java就要学习net"); Student student=new Student();
student.setSname("张大全");
student.setSdesc("编程语言都要学会");
Set<Student> set= new HashSet<Student>();
set.add(student);
course.setStudents(set); session.save(course); transaction.commit();
session.close();
} //4、保存课程的时候同时保存学生,并且建立课程和学生之间的关系
@Test
public void testSaveStudent_Course(){
Session session =sessionFactory.openSession();
Transaction transaction=session.beginTransaction(); Course course=new Course();
course.setCname("Net2 基础");
course.setCdesc("学习完java就要学习net2");
Set<Course> set=new HashSet<Course>();
set.add(course); Student student=new Student();
student.setSname("张大全2");
student.setSdesc("编程语言都要学会2");
student.setCourses(set); session.save(student); transaction.commit();
session.close();
} //5、已经存在一个课程,新建一个学生,并且建立该学生和该课程之间的关系
@Test
public void testSaveCourse_R_Student(){
Session session=sessionFactory.openSession();
Transaction transaction= session.beginTransaction(); Course course=(Course) session.get(Course.class, 1L); Student student=new Student();
student.setSname("fds");
student.setSdesc("1234567890-="); Set<Course> set =new HashSet<Course>();
set.add(course); student.setCourses(set); session.save(student); transaction.commit();
session.close();
} //6、已经存在一个学生,新建一个课程,并且建立该学生和该课程之间的关系
@Test
public void testSaveStudent_R_Course(){
Session session=sessionFactory.openSession();
Transaction transaction=session.beginTransaction(); Student student=(Student) session.get(Student.class,13L); Course course=new Course();
course.setCname("C++ 大学教材");
course.setCdesc("dsajkdsfnsdahfsdjkabdklsatgf"); student.getCourses().add(course); session.save(student); transaction.commit();
session.close();
} //7、已经存在一个学生,已经存在一个课程,解除该学生和原来课程之间的关系,建立该学生和新课程之间的关系
@Test
public void testRelease_Rebuild(){
Session session=sessionFactory.openSession();
Transaction transaction=session.beginTransaction(); Student student=(Student) session.get(Student.class, 13L);
Course course=(Course) session.get(Course.class, 2L); Set<Course> courses= student.getCourses();
for(Course c:courses){
if(c.getCid()==5){
courses.remove(c);
break;
}
} courses.add(course); transaction.commit();
session.close();
} //8、已经存在一个学生,已经存在多个课程,解除该学生和原来多个课程之间的关系,建立该学生和新的多个课程之间的关系
@Test
public void testRelaease_All(){
Session session=sessionFactory.openSession();
Transaction transaction=session.beginTransaction(); Student student=(Student) session.get(Student.class, 13L);
Set<Course> courses=student.getCourses();
for(Course c:courses){
if(c.getCid()==1 || c.getCid()==2){
courses.remove(c);
break;///????不能同时删除两个,只能break,删除一个
}
} Course c4=(Course) session.get(Course.class, 4L);
Course c5=(Course) session.get(Course.class, 5L); courses.add(c4);
courses.add(c5); transaction.commit();
session.close();
}
//已经存在一个学生,解除该学生和该学生的所有的课程之间的关系
@Test
public void testR_All(){
Session session=sessionFactory.openSession();
Transaction transaction =session.beginTransaction(); Student student=(Student) session.get(Student.class, 12L);
student.setCourses(null); transaction.commit();
session.close();
} //解除该课程和所有的学生之间的关系,再重新建立该课程和一些新的学员之间的关系
/*
* 说明:
* * 必须由学生来维护关系
* * 已经条件是课程
* cid-->course-->set<student>-->遍历每一个student
* -->从每一个student中得到所有的课程-->找到要移除的课程-->移除
*
*/ @Test
public void testRemoveAll_Rebuild(){
Session session= sessionFactory.openSession();
Transaction transaction= session.beginTransaction(); Course course=(Course) session.get(Course.class, 4L);//获取该课程
Set<Student> students=course.getStudents();//获取该课程的学生
for(Student s:students){
Set<Course> courses=s.getCourses();//该学生所选取的所有课程
for(Course c:courses){
if(c.getCid()==4){
courses.remove(c);
break;
}
}
} Student s1=(Student) session.get(Student.class, 9L);
Student s2=(Student) session.get(Student.class, 10L);
s1.getCourses().add(course);
s2.getCourses().add(course); transaction.commit();
session.close();
} }

多对多例子

Hibernate 多对多关联Demo的更多相关文章

  1. hibernate多对多关联映射

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  2. atitit.atitit.hb many2one relate hibernate 多对一关联配置..

    atitit.atitit.hb many2one relate hibernate 多对一关联配置.. 1. 多对一单向 @ManyToOne 1 1. 其中@JoinColumn 注解 2 2.  ...

  3. 05.Hibernate多对多关联

        前言:本文讲解使用Hibernate映射多对多关联关系,并使用多种方式映射多对多关联. 1.数据库表的多对多关系     本文根据学生信息表(tb_student)和教师信息表(tb_teac ...

  4. Hibernate多对多关联

    多对多关联: 示例:Teacher和Student,一个Teacher可以教很多student,一个Student也可以被很多teacher教   多对多单向关联 Teacher知道自己教了哪些学生, ...

  5. Hibernate多对多关联映射的HQL中的in条件查询问题

    群里有朋友求解一个问题,高分求一条HQL多对多查询语句 . 问题描述见 http://topic.csdn.net/u/20090621/16/4eac6fe0-bf3e-422e-a697-f758 ...

  6. Hibernate 多对一关联查询

     版权声明:本文为博主原创文章,如需转载请标注转载地址.  博客地址:http://www.cnblogs.com/caoyc/p/5598269.html  一.单向多对一和双向多对一的区别 如果只 ...

  7. Hibernate 多对多关联映射, 中间表加查询条件

    package com.coracle.yk.xpo.po.base; import java.util.Date; import java.util.HashSet; import java.uti ...

  8. hibernate 多对一关联

    (转自尚学堂教学内容)   注解多对一: package com.bjsxt.hibernate; import javax.persistence.Entity; import javax.pers ...

  9. Hibernate 多对多关联查询条件使用

    from Brand as b inner join fetch b.styles as s where s.styleId=?

随机推荐

  1. 【树状数组】CSU 1811 Tree Intersection (2016湖南省第十二届大学生计算机程序设计竞赛)

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1811 题目大意: 一棵树,N(2<=N<=105)个节点,每个节点有一种颜 ...

  2. sharepoint2007的中文版

    今天终于下载到了sharepoint2007的中文版了,以前微软的测试板也没有中文版,今天终于下载到了,经过测试,用英文版的sn也是可以用的.微软提供的测试版,输入正式的key,就可以变成正式版了.我 ...

  3. 奔跑的xiaodao

    http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2086 很明显的一个二分题目.因为要 ...

  4. 转:给C++初学者的50个忠告

                                                           转:给C++初学者的50个忠告 1.把C++当成一门新的语言学习(和C没啥关系!真的.): ...

  5. 从大学开始学C++到现在的一些感悟

    Since I choose this road, I will not regret it.     --Mereyct 端午过后的第二天,闲着没事,更新一下博客. 写这个博客的原因是,看到了群里有 ...

  6. cocos2d的框架思路

    这是我第一次写cocos的框架思路哈,虽然只是写完了一个程序,按理来说应该再多写一些,多积累一些经验了再来写这个框架的构成,但是我觉得还是把我这次写代码的所有想法先记下来哈,等到以后继续写cocos的 ...

  7. [Locked] Number of Connected Components in an Undirected Graph

    Number of Connected Components in an Undirected Graph Given n nodes labeled from 0 to n - 1 and a li ...

  8. Swing实现文件选择(目录选择)附导出

    具体生成工具如图: (1) (2) (3) (4) 源码 : example.java package org.qiailin.jframe; import java.awt.Container; i ...

  9. 第1章 Python基础之字符编码

    阅读目录 一.什么是字符编码 二.字符编码分类 三.字符编码转换关系 3.1 程序运行原理 3.2 终极揭秘 3.3 补充 总结 回到顶部 一.什么是字符编码 计算机要想工作必须通电,也就是说'电'驱 ...

  10. Python判断上传文件类型

    在开发上传服务时,经常需要对上传的文件进行过滤. 本文为大家提供了python通过文件头判断文件类型的方法,非常实用. 代码如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...