以学生[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. windows7+iis7+php的配置

    最近在找工作,人被逼了,所以没事就学习php了.以下是开发环境的搭建: 环境搭建 然后就是解析php脚本的两种配置方法: fastCgiModule与ISAPI方式 两种配置方法 本文为转载...

  2. AlgorithmsI PA2: Randomized Queues and Deques RandomizedQueue

    RandomizedQueue 有几个关键点: 1. 选择合适的数据结构,因为需要任意位置删除元素,Linked list 做不到,必须使用resizing arrays. 2. resizing 的 ...

  3. BestCoder Round #52 (div.1)

    这周六BC和CF又差点打架,精力不够啊...结果打BC没起来,就看了一眼题跑了...今天早上补补吧,(因为今天晚上还要打UER= =) 先放官方题解: 1000 Victor and Machine ...

  4. 安装Maven、nexus

    一.软件包版本 jdk:jdk1.7.0_79 maven:apache-maven-3.3.3-bin.tar.gz nexus:nexus-webapp-2.8.0-05.war 二.安装mave ...

  5. 【转】Android 菜单(OptionMenu)大全 建立你自己的菜单--不错

    原文网址:http://www.cnblogs.com/salam/archive/2011/04/04/2005329.html 菜单是用户界面中最常见的元素之一,使用非常频繁,在Android中, ...

  6. 字符串(后缀自动机):HDU 4622 Reincarnation

    Reincarnation Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

  7. bzoj3223 Tyvj 1729 文艺平衡树(Splay Tree+区间翻转)

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2202  Solved: 1226[Submit][Sta ...

  8. web前端开发中Nodejs、Grunt、npm等的介绍、使用

    一.Nodejs的安装: Grunt和所有grunt插件都是基于nodejs来运行的,如果你的电脑上没有nodejs,就去安装吧.去 https://nodejs.org/ 上,点击页面中那个绿色.大 ...

  9. Krypton Factor 困难的串-Uva 129(回溯)

    原题:https://uva.onlinejudge.org/external/1/129.pdf 按照字典顺序生成第n个“困难的串” “困难的串”指的是形如ABAB, ABCABC, CDFGZEF ...

  10. Trident-MySQL

    使用事物TridentTopology 持久化数据到MySQL 1.构建拓扑JDBCTopology类 package storm.trident.mysql; import java.util.Ar ...