hibernate 2 多对多映射
一、实体类
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 多对多映射的更多相关文章
- Hibernate的多对一映射
一.创建Java工程,新建Lib文件夹,加入Hibernate和数据库(如MySql.Oracle.SqlServer等)的Jar包,创建 hibernate.cfg.xml 文件,并配置,配置项如下 ...
- Hibernate的多对多映射关系
example: 老师(teacher)和学生(Student)就是一个多对多的关系吧?老师可以有多个学生,学生也可以由多个老师,那在Hibernate中多对多是怎样实现的呢?? 在Hibernate ...
- hibernate单向多对一映射
n21: 1.new 两个实体类,一个代表"多"的一端,一个代表"一"的一端. Customer类: public class Customer { priva ...
- hibernate之多对多映射
目录 第一章 多对多的应用场景 第二章 多对多的映射配置案例 2-1 创建项目和表 2-2 创建持久化类和映射文件 2-3 配置映射文件 2-4 测试 第三章 总结 源码地址:https://gith ...
- Hibernate的多对多映射
一.创建Java工程,新建Lib文件夹,加入Hibernate和数据库(如MySql.Oracle.SqlServer等)的Jar包,创建 hibernate.cfg.xml 文件,并配置,配置项如下 ...
- Hibernate(八)多对多映射
一.创建数据表 --学生证表 create table paper ( pid number primary key, pdesc ) , sid number references student( ...
- 【Hibernate框架】关联映射(多对多关联映射)
按着我们的总结行进计划,接下来,就是有关于多对多映射的总结了. 我们来举个例子啊,很长时间以来,房价暴涨不落,但是还有很多人拥有很多套房产,假如说,一个富豪拥有九套房产,家里人么准去住哪一套,我们就以 ...
- 【Hibernate框架】关联映射(一对多,多对一)
根据我们的总结计划,上篇文章我们总结了有关于一对一映射相关知识,接下来,我们进行下一个阶段,一对多.多对一映射相关知识. 场景设定: 国家规定,一个人只能在一个公司上班,一个公司可以拥有很多员工.我们 ...
- hibernate笔记--单(双)向的多对多映射关系
在讲单向的多对多的映射关系的案例时,我们假设我们有两张表,一张角色表Role,一张权限表Function,我们知道一个角色或者说一个用户,可能有多个操作权限,而一种操作权限同时被多个用户所拥有,假如我 ...
随机推荐
- 【BZOJ1492】【Luogu P4027】 [NOI2007]货币兑换 CDQ分治,平衡树,动态凸包
斜率在转移顺序下不满足单调性的斜率优化\(DP\),用动态凸包来维护.送命题. 简化版题意:每次在凸包上插入一个点,以及求一条斜率为\(K\)的直线与当前凸包的交点.思路简单实现困难. \(P.s\) ...
- 安装python3之后,yum用不了
使用centos 安装python3,并默认python3为python版本之后,用不了yum 原因是yum依赖于python2组件 解决方法: vi /usr/bin/yum 和 vi /usr/l ...
- N皇后问题的递归与非递归解法
都在注释里了: public class NQueen { public static void main(String[] args) { Scanner sc = new Scanner(Syst ...
- pyqt5-QTDesigner--控件操作
Edit菜单 编辑小伙伴.用鼠标直接拖 编辑控件---样式等等. 点击需要编辑的控件---> 信号与槽 先用鼠标从控件往外拖---> --->选中相应的信 ...
- 17.树的子结构(python)
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) class Solution: def HasSubtree(self, pRoot1, pRoo ...
- 几道好玩的JS题目,看看你能答中几道。
1,for (var i = 0; i < 5; i++) { console.log(i); } 这几行代码会输出什么? 输出 0 1 2 3 4 2,for (var i = 0; i &l ...
- ExcelUtils
本ExcelUtils工具类是用poi写的,仅用于线下从excel文件中读取数据.如果生产环境要用的话,建议切换到阿里的easyexcel. 引入poi.jar: <!-- https://mv ...
- HDU 6656 Kejin Player
hdu题面 Time limit 5000 ms Memory limit 524288 kB OS Windows 解题思路 因为升级只能一级一级地升,所以所求期望满足了区间加的性质,可以一级一级地 ...
- Python文件对象方法
使用open()函数创建一个文件对象,这里是可以在这个对象上调用的函数的列表 - 编号 方法名称 描述 1 file.close() 关闭文件,无法读取或写入关闭的文件. 2 file.flush() ...
- (79)【按键】[独立按键] - 1: 单击,双击,三击以及N击
此按键程序的实现的功能是单个独立按键的[单击],[长按],[双击],[三击]以及[多击].本文分为三个部分, 第一个部分是说[单击],[长按]的程序: 第二部分是讲[双击]: 第三部分是讲[三击],[ ...