一、实体类

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. [易学易懂系列|rustlang语言|零基础|快速入门|(10)|Vectors容器]

    [易学易懂系列|rustlang语言|零基础|快速入门|(10)] 有意思的基础知识 Vectors 我们之前知道array数组是定长,只可我保存相同类型的数据的数据类型. 如果,我们想用不定长的数组 ...

  2. VM10 不能安装VMware tools的解决方法

    当安装VMware tools,提示"正在进行简易安装时,无法手动启动VMware TOOLS安装",把CD-ROM设置成自动检测就可以了.

  3. SpringMVC POJO传参方式

    有两POJO类 Address.java package com.proc; public class Address { private String province; private Strin ...

  4. jquery easyui datagrid 远程加载数据----javascript法

    jquery easyui有三种办法生成datagrid(数据网格),本篇专门讨论javascript借助jquey easy ui实现的方式 html部分 <main role="m ...

  5. oracle基本语句(第四章、数据库安全管理)

    1.用SYS用户以SYSDBA身份登录SQL Plus,使用DBA_USERS视图查看用户信息: SELECT USERNAME, ACCOUNT_STATUS, CREATED FROM DBA_U ...

  6. electron-vue 更新 使用electron-update的版本

    electron-vue使用的electron版本比较老,用最新的electron-update会报错 我用这个版本成功 "electron-updater": "^3. ...

  7. 【leetcode】LCP 1. Guess Numbers

    题目如下: 小A 和 小B 在玩猜数字.小B 每次从 1, 2, 3 中随机选择一个,小A 每次也从 1, 2, 3 中选择一个猜.他们一共进行三次这个游戏,请返回 小A 猜对了几次? 输入的gues ...

  8. Python 爬虫十六式 - 第一式:HTTP协议

    HTTP:伟大而又无闻的协议 学习一时爽,一直学习一直爽!   Hello,大家好啊,我是Connor,一个从无到有的技术小白.有的人一说什么是HTTP协议就犯愁,写东西的时候也没想过什么是HTTP协 ...

  9. python – 如何禁用Django的CSRF验证?

    如果只需要一些视图不使用CSRF,可以使用@csrf_exempt: from django.views.decorators.csrf import csrf_exempt @csrf_exempt ...

  10. 容器————unordered_map

    #include < unordered_map > map: map内部实现了一个红黑树(红黑树是非严格平衡二叉搜索树,而AVL是严格平衡二叉搜索树),红黑树具有自动排序的功能,因此ma ...