一、实体类

1、Classes.java

 package cn.gs.wwg.entity;

 import java.util.Set;

 public class Classes {
private int cid;
private String cname;
private String cdescription;
private Set<Student> students;
public int getCid() {
return cid;
}
public void setCid(int cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public String getCdescription() {
return cdescription;
}
public void setCdescription(String cdescription) {
this.cdescription = cdescription;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
} }

2、Student.java

 package cn.gs.wwg.entity;

 import java.io.Serializable;
import java.util.Set; public class Student implements Serializable{
private int sid;
private String sname;
private String sdescription;
private Set<Classes> classes; public Set<Classes> getClasses() {
return classes;
}
public void setClasses(Set<Classes> classes) {
this.classes = classes;
}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSdescription() {
return sdescription;
}
public void setSdescription(String sdescription) {
this.sdescription = sdescription;
} }

二:配置映射信息,建立表与类之间关系

1、Classes.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:持久化类全名
table: 表名 可以不写 默认和实体类名一致
-->
<class name="cn.gs.wwg.entity.Classes" >
<!--
标示属性 和数据库中主键对应
-->
<id name="cid" column="cid" type="java.lang.Integer">
<!-- 主键产生器 -->
<generator class="assigned"> </generator>
</id>
<property name="cname" column="cname" type="java.lang.String"></property>
<property name="cdescription" column="cdescription" type="java.lang.String"></property>
<!--
cascade="save-update"
当保存班级的时候对学生进行什么样的操作
-->
<set name="students" table="student_classes" cascade="all">
<!-- key用来描述外键
set元素对应了classes类中的集合
通过key是通过外键的形式将两张表建立联系
通过one-to-many让两个类建立关联
-->
<key>
<column name="cid"></column>
</key>
<many-to-many class="cn.gs.wwg.entity.Student" column="sid"></many-to-many>
</set>
</class>
</hibernate-mapping>

2、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:持久化类全名
table: 表名 可以不写 默认和实体类名一致
-->
<class name="cn.gs.wwg.entity.Student" >
<!--
标示属性 和数据库中主键对应
-->
<id name="sid" column="sid" type="java.lang.Integer">
<!-- 主键产生器 -->
<generator class="assigned"> </generator>
</id>
<property name="sname" column="sname" type="java.lang.String"></property>
<property name="sdescription" column="sdescription" type="java.lang.String"></property>
<!--
多对一 column 描述外键
-->
<set name="classes" table="student_classes" cascade="all">
<!-- key用来描述外键
set元素对应了classes类中的集合
通过key是通过外键的形式将两张表建立联系
通过one-to-many让两个类建立关联
-->
<key>
<column name="sid"></column>
</key>
<many-to-many class="cn.gs.wwg.entity.Classes" column="cid"></many-to-many>
</set>
</class>
</hibernate-mapping>

三、编写配置文件,连接数据库,引入映射信息文件

hibernate.cfg.xml

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration>
<!-- 一个session-factory只能链接一个数据库 -->
<session-factory>
<!--
进行数据库连接
driver:驱动
url:地址
username:数据库连接用户名
password:数据库连接密码
数据库方言
不同的数据库中,sql语法略有区别. 指定方言可以让hibernate框架在生成sql语句时.针对数据库的方言生成.
sql99标准: DDL 定义语言 库表的增删改查
DCL 控制语言 事务 权限
DML 操纵语言 增删改查
注意: MYSQL在选择方言时,请选择最短的方言.
-->
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost::orcl</property>
<property name="connection.username">liuyang</property>
<property name="connection.password">orcl</property>
<!--
自动建表
auto schema export 自动导出表结构. 自动建表
hibernate.hbm2ddl.auto create 自动建表.每次框架运行都会创建新的表.以前表将会被覆盖,表数据会丢失.(开发环境中测试使用)
hibernate.hbm2ddl.auto create-drop 自动建表.每次框架运行结束都会将所有表删除.(开发环境中测试使用)
hibernate.hbm2ddl.auto update(推荐使用) 自动生成表.如果已经存在不会再生成.如果表有变动.自动更新表(不会删除任何数据).
hibernate.hbm2ddl.auto validate 校验.不自动生成表.每次启动会校验数据库中表是否正确.校验失败.
-->
<!-- <property name="hbm2ddl.auto">update</property> -->
<property name="hbm2ddl.auto">update</property> <!-- 将hibernate生成的sql语句打印到控制台 -->
<property name="show_sql">true</property>
<!-- 添加映射文件 -->
<!-- <mapping resource="cn/gs/ly/entity/Person.hbm.xml"></mapping> -->
<!-- <mapping resource="cn/gs/ly/school/entity/Student.hbm.xml"></mapping> -->
<!-- <mapping resource="cn/gs/ly/school/entity/Classes.hbm.xml"></mapping> -->
<mapping resource="cn/gs/wwg/entity/Classes.hbm.xml"></mapping>
<mapping resource="cn/gs/wwg/entity/Student.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>

四、测试类

ManyToManyTest.java

 package cn.gs.wwg.entity.test;

 import java.util.HashSet;
import java.util.List;
import java.util.Set; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import cn.gs.wwg.entity.Classes;
import cn.gs.wwg.entity.Student; public class ManyToManyTest { SessionFactory factory =null;
Session se = null;
Transaction tr = null; @Before
public void beforeStart(){
Configuration con = new Configuration();
con.configure();
factory = con.buildSessionFactory();
se = factory.openSession();
tr = se.beginTransaction();
}
@After
public void afterClose(){
tr.commit();
se.close();
} //3.新建一个班级的同时新建一个学生
@Test
public void testSaveStudent_Cascade_classes_Save(){ Student student = new Student();
student.setSid();
student.setSname("小明");
student.setSdescription("调皮捣蛋"); Classes classes = new Classes();
classes.setCid();
classes.setCname("gs01");
classes.setCdescription("有上升空间"); // Set<Classes> cla = new HashSet<Classes>();
// cla.add(classes);
// student.setClasses(cla);
Set<Student> stu = new HashSet<Student>();//实例化一个Set集合存放学生
stu.add(student); //把学生添加到集合中
classes.setStudents(stu);
se.save(classes); } // 4.已经存在一个班级,新建一个学生 建立联系 inverse (班级)
@Test
public void testUpdateclasses_Cascade_Student_Save_R(){
Classes classes = (Classes)se.get(Classes.class, );
Student student = new Student();
student.setSid();
student.setSname("萌萌");
student.setSdescription("萌男人");
classes.getStudents().add(student);
//se.save(student); } // 4.已经存在一个班级,新建一个学生 建立联系 inverse (学生)
@Test
public void testSaveStudent_R(){
Classes classes = (Classes)se.get(Classes.class, );
Student student = new Student();
student.setSid();
student.setSname("神秘人");
student.setSdescription("未知");
Set<Classes> cla = new HashSet<Classes>();
cla.add(classes);
student.setClasses(cla);
se.save(student); } //5.已经存在一个学生,新建一个班级
@Test
public void testSaveStudent_CreateClass(){
Student student = (Student)se.get(Student.class, );
Classes classes = new Classes();
classes.setCid();
classes.setCname("gs02");
classes.setCdescription("一群学霸");
student.getClasses().add(classes);
} //6.把一个学生从一个班级转到另一个班级。
@Test
public void testTransform(){
Student student = (Student) se.get(Student.class, );//学生1从1班转到2班
Classes classes1 = (Classes)se.get(Classes.class, );
Classes classes2 = (Classes)se.get(Classes.class, );
student.getClasses().remove(classes1);
student.getClasses().add(classes2);
} //8.解除一个班级和一些学生的关系
@Test
public void test_Some(){
Student student = (Student)se.get(Student.class, );
Student student2 = (Student)se.get(Student.class, );
student.setClasses(null);
student2.setClasses(null);
} //11.已经存在了一个班级,也存在许多学生 建立班级与学生的关系。方法一
@Test
public void testR_Some(){
Classes classes = (Classes)se.get(Classes.class,);
Student student = (Student)se.get(Student.class, );
Student student2 = (Student)se.get(Student.class, );
student.getClasses().add(classes);
student2.getClasses().add(classes);
// classes.getStudents().add(student2);Ч�ʸ�
// classes.getStudents().add(student);
} //11.已经存在了一个班级,也存在许多学生 建立班级与学生的关系。方法二
@Test
public void testR_Some_2(){
Classes classes = (Classes)se.get(Classes.class,);
List<Student> studentList = se.createQuery("from Student where sid in(1,2)").list();
classes.getStudents().addAll(studentList);
} //12.已经存在了一些班级,也存在许多学生 建立班级与学生的关系。(每名学生都有多个班级)
@Test
public void testR_Some_3(){
List<Student> studentList = se.createQuery("from Student where sid in(3,4)").list();
List<Classes> classesList = se.createQuery("from Classes where cid in(1,2)").list();
for(Student s:studentList){
s.getClasses().addAll(classesList); //学生3、4都关联两个班级1、2
}
} //13.删除班级
@Test
public void testR_Some_5(){
Classes classes = (Classes)se.get(Classes.class, );
//classes.setStudents(null); //解除关系 inverse="true"时需此操作
se.delete(classes);
}
}

hibernate 2 多对多映射的更多相关文章

  1. Hibernate的多对一映射

    一.创建Java工程,新建Lib文件夹,加入Hibernate和数据库(如MySql.Oracle.SqlServer等)的Jar包,创建 hibernate.cfg.xml 文件,并配置,配置项如下 ...

  2. Hibernate的多对多映射关系

    example: 老师(teacher)和学生(Student)就是一个多对多的关系吧?老师可以有多个学生,学生也可以由多个老师,那在Hibernate中多对多是怎样实现的呢?? 在Hibernate ...

  3. hibernate单向多对一映射

    n21: 1.new 两个实体类,一个代表"多"的一端,一个代表"一"的一端. Customer类: public class Customer { priva ...

  4. hibernate之多对多映射

    目录 第一章 多对多的应用场景 第二章 多对多的映射配置案例 2-1 创建项目和表 2-2 创建持久化类和映射文件 2-3 配置映射文件 2-4 测试 第三章 总结 源码地址:https://gith ...

  5. Hibernate的多对多映射

    一.创建Java工程,新建Lib文件夹,加入Hibernate和数据库(如MySql.Oracle.SqlServer等)的Jar包,创建 hibernate.cfg.xml 文件,并配置,配置项如下 ...

  6. Hibernate(八)多对多映射

    一.创建数据表 --学生证表 create table paper ( pid number primary key, pdesc ) , sid number references student( ...

  7. 【Hibernate框架】关联映射(多对多关联映射)

    按着我们的总结行进计划,接下来,就是有关于多对多映射的总结了. 我们来举个例子啊,很长时间以来,房价暴涨不落,但是还有很多人拥有很多套房产,假如说,一个富豪拥有九套房产,家里人么准去住哪一套,我们就以 ...

  8. 【Hibernate框架】关联映射(一对多,多对一)

    根据我们的总结计划,上篇文章我们总结了有关于一对一映射相关知识,接下来,我们进行下一个阶段,一对多.多对一映射相关知识. 场景设定: 国家规定,一个人只能在一个公司上班,一个公司可以拥有很多员工.我们 ...

  9. hibernate笔记--单(双)向的多对多映射关系

    在讲单向的多对多的映射关系的案例时,我们假设我们有两张表,一张角色表Role,一张权限表Function,我们知道一个角色或者说一个用户,可能有多个操作权限,而一种操作权限同时被多个用户所拥有,假如我 ...

随机推荐

  1. CDN杂谈

    两大cdn公司:一个是Akamai,一个是LimeLight,所以有两个阵营 CDN在利用DNS的转授权来引导最终访问者找到最理想的缓存或者镜像点,他是一种基于域名的服务.在不同的实现方式下,最终的定 ...

  2. framebuffer测试程序

    /* framebuffer简单测试程序 网上转载 很多次 的程序 :-) */ #include <stdio.h> #include <stdlib.h> #include ...

  3. [易学易懂系列|rustlang语言|零基础|快速入门|(11)|Structs结构体]

    [易学易懂系列|rustlang语言|零基础|快速入门|(11)] 有意思的基础知识 Structs 我们今天来看看数据结构:structs. 简单来说,structs,就是用来封装相关数据的一种数据 ...

  4. 十三、S3C2440 裸机 — 初始化代码及MMU

    13.1 NOR FLASH 搬运 把程序从 nor flash 上搬运到 SDRAM 中 程序存储在 nor flash 上,运行时将程序搬运到 SDRAM 中运行 nor flash 启动:nor ...

  5. Django报错 No module named 'django.templates'

    前言 Django 模板报错了 修改方法: 将你的工程文件下(my_site)的settings.py中的TEMPLATES中的templates字段全部改为template, 亲测可用~^~

  6. 访问SpringBoot中的Swagger的方法

    1.首先启动springboot+swagger的工程. 2.在application.yml里面查看服务的端口号,比如这里是9510. 3.访问URL:http://localhost:9510/t ...

  7. 建立PHP的本地调试环境PHP基础教程

    对于windows平台而言,PHP供给了一个安装程序,但是这个安装程序是不能直接运行来建立个人服务器平台的,而是必需嵌进现有的服务器平台,如:Windows NT下的IIS或Windows下的PWS, ...

  8. 【Leetcode】对称二叉树

    递归法 执行用时 :12 ms, 在所有 C++ 提交中击败了43.44%的用户 内存消耗 :14.6 MB, 在所有 C++ 提交中击败了95.56%的用户 /** * Definition for ...

  9. [CF1101F]Trucks and Cities:分治优化决策单调性

    分析 好像是有一个叫这个名字的算法,链接. 令\(f[i][j][k]\)表示一辆每公里耗油量为\(1\)的货车从\(i\)到\(j\)中途加\(k\)次油最小的油箱容量.枚举所有的起点和中途加油的次 ...

  10. es之索引的别名操作

    1:增加别名 为索引school添加一个别名alias1: 1.1:创建索引 PUT student{ "settings": {"number_of_shards&qu ...