以学生[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. Delphi判断文件是否正在被使用(CreateFile也可以只是为了读取数据,而不是创建)

    首先,我们先来认识下CreateFile函数,它的原型如下   HANDLE CreateFile( LPCTSTR lpFileName,    //指向文件名的指针 DWORD dwDesired ...

  2. [置顶] 技术人血泪史:七种IT失误让你直接走人

    IT人士的真实故事:搞出大麻烦,旋即遭解雇 如今想找一份理想的IT工作并不容易,但丢掉一份工作却非常简单. 导致自己被炒鱿鱼的原因很多,无论是没能尽到保护雇主数字资产的义务.或者是滥用手中的权限以达到 ...

  3. java学习之负数的进制

    在上一篇内容当中说明了什么是进制,进制存在的原因以及形式,接下来说一下一个比较特殊的进制计算,就是负数的在计算机当中的表示.举个个例子来说 6的二进制表示是什么? 0000-0000-0000-000 ...

  4. find the safest road(floyd)

    Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission ...

  5. 有两个指针pa,pb分别指向有两个数,a,b,请写一个函数交换两个指针的指向,也就是让pa指向b,让pb指向a

    题目:有两个指针pa,pb分别指向有两个数,a,b,请写一个函数交换两个指针的指向,也就是让pa指向b,让pb指向a,具体实现如下: #include<stdlib.h> #include ...

  6. HDU 5501 背包问题

    需要按照B/C的值从大到小排序. #include<cstdio> #include<cstring> #include<iostream> #include< ...

  7. (转载)mysql查询今天、昨天、7天、近30天、本月、上一月数据

    (转载)http://blog.163.com/dreamman_yx/blog/static/26526894201053115622827/ 查询 今天 select * from 表名 wher ...

  8. HOWTO:保存nohup日志

    默认情况下,nohup的日志将保存在一个名为nohup.out的文件中.随着时间的推移,nohup.out文件会变得越来越大,直到某一天程序莫名的崩溃.这种情况是可以预防的,有很多策略都可以解决这个问 ...

  9. 转载:linux capability深入分析

    转至http://www.cnblogs.com/iamfy/archive/2012/09/20/2694977.html 一)概述:  1)从2.1版开始,Linux内核有了能力(capabili ...

  10. U磁盘检测和大量收集量产工具

    1.ChipGenius ChipGenius是一款USB设备芯片型号检測工具,能够自己主动查询U盘.MP3/MP4.读卡器.移动硬盘等一切USB设备的主控芯片型号.制造商.品牌.并提供相关资料下载地 ...