以学生[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. 设计模式 Mixin (混入类)

    混入(mix-in)类代表类之间的另一种关系.在C++中,混入类的语法类似于多重继承,但是语义完全不同.混入类回答"这个类还可以做什么"这个问题,答案经常以"-able& ...

  2. BZOJ 1029 [JSOI2007]建筑抢修 已更新

    1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 2748  Solved: 1213[Submit][Statu ...

  3. poj 2408 Apple Tree

    http://poj.org/problem?id=2486 典型的回溯题目:特别是状态方程用三维的来标记是否要走回路. 题意:一颗树,n个点(1-n),n-1条边,每个点上有一个权值,求从1出发,走 ...

  4. QTP自传之描述性编程

    描述性编程,即采用描述性的语言定位对象,不需要事先将对象添加到对象库中.下面,就说说如何使用描述性编程,我们将继续使用对象库编程中的网页. 使用描述性编程的两种方法 直接描述 对象("属性名 ...

  5. 在asp.net中使用confirm可以分为两种:

    在asp.net中使用confirm可以分为两种: 1.没有使用ajax,confirm会引起也面刷新 2.使用了ajax,不会刷新 A.没有使用ajax,可以用StringBuilder来完成. ( ...

  6. QML官方系列教程——QML Applications

    附网址:http://qt-project.org/doc/qt-5/qmlapplications.html 假设你对Qt的官方demo感兴趣,能够參考本博客的另一个系列Qt5官方demo解析集 每 ...

  7. 定制属于自己的Chrome起始页

    个人感觉没什么技术含量,可是很有用.我定制的起始页面例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ19saWNodW4=/font/5 ...

  8. Java基础知识强化之IO流笔记13:递归之不死神兔问题(斐波那契数列)

    1.这个问题是如下的:    有一对兔子,从出生后第3个月起,每个月都生一对兔子,小兔子长到第3个月又生一对兔子,加入兔子都不死,问第20个月兔子的对数? 分析:我们找规律 兔子对数第1个月:   1 ...

  9. Android的GridView和Gallery结合Demo

    Android的GridView和Gallery结合Demo Demo介绍:首页是一个GridView加载图片,竖屏时显示3列图片,横屏时显示4列图片;并且对图片进行大小限制和加灰色边框处理. 点击某 ...

  10. 9.8 noip模拟试题

    LazyChild黑OJ(blackoj.pas/c/cpp) LazyChild开了一家“善良OJ”.但大多数人都不知道,这其实是家黑OJ.亲爱的同学,请不要惊讶,古时候有黑店,现代为什么不能有黑O ...