Hibernate 多对多关联Demo
以学生[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的更多相关文章
- hibernate多对多关联映射
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- atitit.atitit.hb many2one relate hibernate 多对一关联配置..
atitit.atitit.hb many2one relate hibernate 多对一关联配置.. 1. 多对一单向 @ManyToOne 1 1. 其中@JoinColumn 注解 2 2. ...
- 05.Hibernate多对多关联
前言:本文讲解使用Hibernate映射多对多关联关系,并使用多种方式映射多对多关联. 1.数据库表的多对多关系 本文根据学生信息表(tb_student)和教师信息表(tb_teac ...
- Hibernate多对多关联
多对多关联: 示例:Teacher和Student,一个Teacher可以教很多student,一个Student也可以被很多teacher教 多对多单向关联 Teacher知道自己教了哪些学生, ...
- Hibernate多对多关联映射的HQL中的in条件查询问题
群里有朋友求解一个问题,高分求一条HQL多对多查询语句 . 问题描述见 http://topic.csdn.net/u/20090621/16/4eac6fe0-bf3e-422e-a697-f758 ...
- Hibernate 多对一关联查询
版权声明:本文为博主原创文章,如需转载请标注转载地址. 博客地址:http://www.cnblogs.com/caoyc/p/5598269.html 一.单向多对一和双向多对一的区别 如果只 ...
- Hibernate 多对多关联映射, 中间表加查询条件
package com.coracle.yk.xpo.po.base; import java.util.Date; import java.util.HashSet; import java.uti ...
- hibernate 多对一关联
(转自尚学堂教学内容) 注解多对一: package com.bjsxt.hibernate; import javax.persistence.Entity; import javax.pers ...
- Hibernate 多对多关联查询条件使用
from Brand as b inner join fetch b.styles as s where s.styleId=?
随机推荐
- RR区间锁 不是唯一索引,即使区间内没值,也锁
+--------- +---------------------------------------------------------------------------------------- ...
- Inotify: 高效、实时的Linux文件系统事件监控框架
Inotify: 高效.实时的Linux文件系统事件监控框架 概要 - 为什么需要监控文件系统? 在日常工作中,人们往往需要知道在某些文件(夹)上都有那些变化,比如: 通知配置文件的改变 ...
- 微信下载APK
腾讯应用宝 微信屏蔽了来源不是腾讯的APK function isWeixin() { var ua = navigator.userAgent.toLowerCase() if(ua.match(/ ...
- 数学 ZJOI 2012 数列
#include <iostream> #include <cstring> #include <cstdio> using namespace std; ; st ...
- 暴力求解——Equivalent Strings
Submit Status Description Today on a lecture about strings Gerald learned a new definition of string ...
- [Locked] Paint House I & II
Paint House There are a row of n houses, each house can be painted with one of the three colors: red ...
- C++ static(施工中)
static 变量 头文件中的static会在引用该头文件的cpp中分别生成副本 //H.h #ifndef _H_H_ #define _H_H_ ; #endif //Ex_2.c #includ ...
- 终止imp/exp和expdp/impdp进程运行的方法
一.停止EXP/IMP优化速度 可以直接KILL 进程,但先要KILL 父进程,然后KILL子进程,只KILL子进程,EXP/IMP还会在后台执行的 样例:ps -ef |grep imp 查询到pi ...
- BASH_SOURCE 用法
参考 bash少见的用法 http://blog.csdn.net/wonderisland/article/details/22892759. 原有项目里自带的启动脚本用到了bash_source获 ...
- Spring 基础知识
Spring架构简单描述 原文:https://www.shiyanlou.com/courses/document/212 Spring 概述 1. Spring 是什么 Spring是一个开源的轻 ...