hibernate映射关系之多对多
多对多:
* 关系在第三张表中,和两张表本身没有关系
* 多对多谁维护关系:谁都能维护关系(效率是一样的),一般情况下可以通过页面
来体现
* 关系体现:
第三张表的维护:增加、删除
course类对应的映射文件
<?xml version="1.0" encoding="utf-8"?>
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<HIBERNATE-MAPPING>
<CLASS name="manytomany.Course">
<ID name="cid" length="5" type="java.lang.Long">
<COLUMN name="cid"></COLUMN>
<GENERATOR class="increment"></GENERATOR>
</ID>
<property name="cname" length="50" type="java.lang.String"></property>
<property name="description" length="50" type="java.lang.String"></property>
<!--
table 指的是多对多的第三张表
-->
<SET name="students" inverse="true" cascade="save-update" table="student_course">
<KEY>
<COLUMN name="cid"></COLUMN>
</KEY>
<MANY-TO-MANY class=.manytomany.Student column="sid"></MANY-TO-MANY>
</SET>
</CLASS>
</HIBERNATE-MAPPING>
student表对应的映射文件
<?xml version="1.0" encoding="utf-8"?>
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<HIBERNATE-MAPPING>
<CLASS name="manytomany.Student">
<ID name="sid" length="5" type="java.lang.Long">
<COLUMN name="sid"></COLUMN>
<GENERATOR class="increment"></GENERATOR>
</ID>
<property name="sname" length="50" type="java.lang.String"></property>
<property name="description" length="50" type="java.lang.String"></property>
<!--
table 指的是多对多的第三张表
-->
<SET name="course" cascade="save-update" table="student_course">
<KEY>
<COLUMN name="sid"></COLUMN>
</KEY>
<MANY-TO-MANY class="manytomany".Course column="cid"></MANY-TO-MANY>
</SET>
</CLASS>
</HIBERNATE-MAPPING>
多对多情况示例
import java.lang.annotation.Target;
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;
/**
* 1、保存课程
* 2、保存学生
* 3、保存课程的时候同时保存学生
* 4、保存课程的时候同时保存学生,并且建立课程和学生之间的关系
* 5、已经存在一个课程,新建一个学生,并且建立该学生和该课程之间的关系
* 6、已经存在一个学生,新建一个课程,并且建立该学生和该课程之间的关系
* 7、已经存在一个学生,已经存在一个班级,解除该学生和原来班级之间的关系,建立该学生和新班级之间的关系
* 8、已经存在一个学生,解除该学生和该学生所在班级之间的关系 www.yzyxedu.com
* 9、解除该班级和所有的学生之间的关系,再重新建立该班级和一些新的学员之间的关系
* 10、解除该班级和所有的学生之间的关系
* 11、删除班级
* *
* * 解除该班级和所有的学生之间的关系
* * 删除该班级
* *
* 删除班级的同时删除学生
* 12、删除学生
* 同删除班级
* @author Administrator
*
*/
public class ManyToManyTest {
private static SessionFactory sessionFactory = null;
static{
Configuration configuration = new Configuration();
configuration.configure("cn/itcast/hibernate0909/manytomany/hibernate.cfg.xml");
sessionFactory = configuration.buildSessionFactory();
}
/**
* 保存课程
*/
@Test
public void testSaveCourse(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Course course = new Course();
course.setCname("生理卫生");
course.setDescription("讲得都是讲卫生的");
session.save(course);
transaction.commit();
session.close();
}
/**
* 保存学生
*/
@Test
public void testSaveStudent(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Student student = new Student();
student.setSname("里活命");
student.setDescription("UFO");
session.save(student);
transaction.commit();
session.close();
}
/**
* 保存课程同时保存学生
* Hibernate: select max(cid) from Course
Hibernate: select max(sid) from Student
Hibernate: insert into Course (cname, description, cid) values (?, ?, ?)
Hibernate: insert into Student (sname, description, sid) values (?, ?, ?)
往Course表和Student表中分别插入了一行数据,和关系表没有关系
通过映射文件可以看出,Student维护关系,但是从代码中找不到维护关系的代码
*/
@Test
public void testSaveCourse_Cascade(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
/*
* 新建一个课程
*/
Course course = new Course();
course.setCname("java基础");
course.setDescription("讲课");
/**
* 新建一个学生
*/
Student student = new Student();
student.setSname("得意门生:西门庆");
student.setDescription("高手");
Set<STUDENT> students = new HashSet<STUDENT>();
students.add(student);
/**
* 通过课程建立课程与学生之间的关系
*/
course.setStudents(students);//因为课程是一个新的,所以根据没有学生
session.save(course);
transaction.commit();
session.close();
}
/**
* 保存课程同时保存学生,并且建立关系
*/
@Test
public void testSaveCourse_Cascade_R(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
/**
* 新建课程
*/
Course course = new Course();
course.setCname("java高级");
course.setDescription("专讲框架,由金云龙代课");
Set<COURSE> courses = new HashSet<COURSE>();
courses.add(course);
/**
* 新建学生
*/
Student student = new Student();
student.setSname("班长");
student.setDescription("高手,元方,你怎么看?");
/*
* 通过学生建立学生和课程之间的关系
*/
student.setCourse(courses);
session.save(student);
transaction.commit();
session.close();
}
/**
* 已经存在一个课程,新建一个学生,并且建立该学生和该课程之间的关系
* Hibernate: select course0_.cid as cid0_0_, course0_.cname as cname0_0_, course0_.description as descript3_0_0_ from Course course0_ where course0_.cid=?
Hibernate: select max(sid) from Student www.yzyedu.com
Hibernate: insert into Student (sname, description, sid) values (?, ?, ?)
Hibernate: insert into student_course (sid, cid) values (?, ?)
该sql语句是维护关系
*/
@Test
public void testSaveStudent_R(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
/**
* 1、查找一个课程
* 2、新建一个学生
* 3、通过学生来维护该学生和课程之间的关系
*/
//查找课程2
Course course = (Course)session.get(Course.class, 2L);
//新建一个学生
Student student = new Student();
student.setSname("意门生");
student.setDescription("aa");
//通过学生来维护该学生和课程之间的关系
Set<COURSE> courses = new HashSet<COURSE>();
courses.add(course);
student.setCourse(courses);
session.save(student);
transaction.commit();
session.close();
}
/**
* 已经存在一个学生,新建一个课程,并且建立该学生和该课程之间的关系
*/
@Test
public void testSaveCourse_R(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
/**
* 1、新建一个课程
* 2、查找学生托福答案
* 3、在学生原来的基础上新添加一门课程
*/
//新建课程
Course course = new Course();
course.setCname("项目课");
course.setDescription("得意门生");
//查找学生
Student student = (Student)session.get(Student.class, 5L);
Set<COURSE> courses = student.getCourse();//获取该学生现在所有的课程
courses.add(course);
transaction.commit();
session.close();
}
}
hibernate映射关系之多对多的更多相关文章
- Hibernate学习8—Hibernate 映射关系(多对多)
第二节:Hibernate 多对多映射关系实现 比如学生和课程是多对多的关系: 一个学生可以选多个课程: 一个课程可以被多个学生选中,所以是多对多的关系: 1,多对多单向实现: 单向关系: 这 ...
- hibernate映射关系(多对多)
Student与Teacher关系多对多(只建了2个实体类) public class Student { private int id; private String name; private S ...
- hibernate中表关系为多对多时,如何只删除中间表数据
先说问题:我遇到的问题是,在用户和用户组对象关系中他们是多对多关系.所以中间是成在一张中间表的.经理要求当逻辑删除对象数据时,必须删除中间表中的数据. hibernate是面向对象操作sql语句的,如 ...
- (八)Hibernate 映射关系
所有项目导入对应的hibernate的jar包.mysql的jar包和添加每次都需要用到的HibernateUtil.java 第一节:Hibernate 一对一映射关系实现 1,按照主键映射: 2, ...
- Hibernate学习8—Hibernate 映射关系(一对一)
第一节:Hibernate 一对一映射关系实现 假设一个用户对应一个地址: 1)按照主键映射: User.java: package com.cy.model; public class User ...
- Hibernate映射关系之_多对多
多对多关系由于效率的原因,实际中会拆成相互的一对多的关系,不再累述
- Hibernate 映射关系
映射组成关系 •建立域模型和关系数据模型有着不同的出发点: –域模型: 由程序代码组成, 通过细化持久化类的的粒度可提高代码的可重用性, 简化编程 –在没有数据冗余的情况下, 应该尽可能减少表的数目, ...
- Hibernate学习2--对象的三种状态以及映射关系的简单配置
上篇hibernate的博客总体简单梳理了对象持久化的一些思想以及hibernate中对象持久化化的方法,下面说说对象持久化过程的三种状态. 一.hibernate缓存的概念 1.session与缓存 ...
- hibernate映射(学生-科目-成绩)
实体类 1 public class Student { 2 private int id; 3 private String name; 4 private Set<Score> sco ...
随机推荐
- Win32中文件的操作
1 文件的创建或打开 HANDLE CreateFile( LPCTSTR lpFileName, //文件路径和名称 DWORD dwDesiredAccess, //访问方式,最常用的值 ...
- Android View 事件分发机制详解
想必很多android开发者都遇到过手势冲突的情况,我们一般都是通过内部拦截和外部拦截法解决此类问题.要想搞明白原理就必须了解View的分发机制.在此之前我们先来了解一下以下三个非常重要的方法: di ...
- xapian倒排索引的归并流程
Xapian的检索流程和大部分搜索系统都一样,就先从倒排表抽取候选文档,然后结合其他信息进行排序,取top文档作为搜索结果,具体流程如下: 图1 xapian搜索流程 具体流程 在terms中找到do ...
- DEDECMS5.7 首页和栏目页调用文章按权重排序
dedecms 5.7版本已增加按权重排序功能: [arclist]标签增加按权重排序,在后台管理DEDE里找到以下目录\include\taglib中的arclist.lib.php文件并打开 大约 ...
- OBJ解析
OBJ文件是Alias|Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种标准3D模型文件格式,很适合用于3D软件模 ...
- poj 2240 Arbitrage (Floyd)
链接:poj 2240 题意:首先给出N中货币,然后给出了这N种货币之间的兑换的兑换率. 如 USDollar 0.5 BritishPound 表示 :1 USDollar兑换成0.5 Britis ...
- MySQL slave状态之Seconds_Behind_Master
在MySQL的主从环境中,我们能够通过在slave上运行show slave status来查看slave的一些状态信息,当中有一个比較重要的參数Seconds_Behind_Master.那么你是否 ...
- git pull 部署问题一揽子问题解决
之前遇到问题 在服务器拉取一直不成功, php 的shell函数 调用 git pull 一直不成功 ,但是单独 用root 权限 在机器上面 执行 git pull 是可以的 说明语法没问题. 而 ...
- gitlab hooks
之前一直用文件同步工具进行两台服务器之间的同步 最初的目的是吧gitlab的代码库同步到开发环境中运行 实时的 ,后来由于gitlab的代码仓库的代码不是实时的 于是在即使同步不适合 我的需求. 后来 ...
- HTML5游戏开发技术基础整理
随着HTML5标准终于敲定.HTML5将有望成为游戏开发领域的的热门平台. HTML5游戏能够执行于包含iPhone系列和iPad系列在内的计算机.智能手机以及平板电脑上,是眼下跨平台应用开发的最佳实 ...