分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

Hibernate-ORM:12.Hibernate中的多对多关联关系

发布时间:2023-09-06 01:57责任编辑:沈小雨关键词:Hibernate

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------

本篇博客将讲述Hibernate中的多对多关联关系的操作,准备的篇幅较少,望海涵

一,讲述多对多

  多对多的关联关系,比如学生和教师来说,一个学生由多个教师授课,一个教师授课给多个学生,这就是多对多

  讲述多对多,首先要有一个表叫做中间表,他来承载关联关系

二,实体类的创建

  1.Stu学生类创建:

package cn.dawn.day04.entity;/** * Created by Dawn on 2018/6/2. */import java.io.Serializable;import java.util.Set;/*学生实体类*/public class Stu implements Serializable{ ???private Long sid; ???private String sname; ???/*教师对象集合*/ ???private Set<Tea> teas; ???public Long getSid() { ???????return sid; ???} ???public void setSid(Long sid) { ???????this.sid = sid; ???} ???public String getSname() { ???????return sname; ???} ???public void setSname(String sname) { ???????this.sname = sname; ???} ???public Set<Tea> getTeas() { ???????return teas; ???} ???public void setTeas(Set<Tea> teas) { ???????this.teas = teas; ???}}

  2.Tea教室类的创建:

package cn.dawn.day04.entity;import java.io.Serializable;import java.util.Set;/** * Created by Dawn on 2018/6/2. *//*教师实体类*/public class Tea implements Serializable { ???private Long tid; ???private String tname; ???/*学生对象集合*/ ???private Set<Stu> stus; ???public Long getTid() { ???????return tid; ???} ???public void setTid(Long tid) { ???????this.tid = tid; ???} ???public String getTname() { ???????return tname; ???} ???public void setTname(String tname) { ???????this.tname = tname; ???} ???public Set<Stu> getStus() { ???????return stus; ???} ???public void setStus(Set<Stu> stus) { ???????this.stus = stus; ???}}

三,hbm.xml文件的创建

  1.Stu.hbm.xml

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC ???????"-//Hibernate/Hibernate Mapping DTD 3.0//EN" ???????"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="cn.dawn.day04.entity"> ???<!--如果上面指定package的话,class的name就不必写全类名--> ???<!--lazy:是否懒加载(延迟加载) ???????默认值是true,延迟加载--> ???<!--<class name="Teacher">--> ???<!--直接加载--> ???<class name="Stu" lazy="false"> ???????<!--主键--> ???????<id name="sid" column="sid"> ???????????<!--主键生成策咯 ?assigned程序员自己创建--> ???????????<!--identity是mysql里的自增,一会做增加操作不必再给主键赋值--> ???????????<!--increment是先查最大的主键列,在下一条给主键加一--> ???????????<!--sequence是oracle的主键生成策咯,他一会需要指定序列名字<param name="sequence">序列名</param>--> ???????????<generator class="increment"></generator> ???????</id> ???????<property name="sname" column="tname"></property> ???????<!--table指的是中间表,承载关联关系的表--> ???????<set name="teas" table="tea_stu" cascade="save-update" inverse="false"> ???????????<key> ???????????????<!--本类表的id--> ???????????????<column name="sid"></column> ???????????</key> ???????????<!--另外与他有多对多关联的实体类--> ???????????<many-to-many class="Tea" column="tid"></many-to-many> ???????</set> ???</class></hibernate-mapping>

  2.Tea.hbm.xml文件的创建:

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC ???????"-//Hibernate/Hibernate Mapping DTD 3.0//EN" ???????"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="cn.dawn.day04.entity"> ???<!--如果上面指定package的话,class的name就不必写全类名--> ???<!--lazy:是否懒加载(延迟加载) ???????默认值是true,延迟加载--> ???<!--<class name="Teacher">--> ???<!--直接加载--> ???<class name="Tea" lazy="false"> ???????<!--主键--> ???????<id name="tid" column="tid"> ???????????<!--主键生成策咯 ?assigned程序员自己创建--> ???????????<!--identity是mysql里的自增,一会做增加操作不必再给主键赋值--> ???????????<!--increment是先查最大的主键列,在下一条给主键加一--> ???????????<!--sequence是oracle的主键生成策咯,他一会需要指定序列名字<param name="sequence">序列名</param>--> ???????????<generator class="increment"></generator> ???????</id> ???????<property name="tname" column="tname"></property> ???????<!--table指的是中间表,承载关联关系的表--> ???????<set name="stus" table="tea_stu" cascade="save-update" inverse="false"> ???????????<key> ???????????????<!--本类表的id--> ???????????????<column name="tid"></column> ???????????</key> ???????????<!--另外与他有多对多关联的实体类--> ???????????<many-to-many class="Stu" column="sid"></many-to-many> ???????</set> ???</class></hibernate-mapping>

四,hibernate.cfg.xml中管理上方俩个hbm.xml小配置文件

 ???????<!--与小配置文件映射--> ???????<mapping resource="cn/dawn/day04/dao/Tea.hbm.xml"></mapping> ???????<mapping resource="cn/dawn/day04/dao/Stu.hbm.xml"></mapping>

五,单测方法:

 ???@Test ???/*同时保存,并建立关联关系*/ ???public void t1ManyToManyInsert(){ ???????/* ????????* 新建一个教师 ????????*/ ???????Tea tea1=new Tea(); ???????tea1.setTname("老雨"); ???????/** ????????* 新建俩个学生 ????????*/ ???????Stu stu1=new Stu(); ???????stu1.setSname("小六"); ???????Stu stu2=new Stu(); ???????stu2.setSname("小八"); ???????Set<Stu> students = new HashSet<Stu>(); ???????students.add(stu1); ???????students.add(stu2); ???????/** ????????* 通过课程建立课程与学生之间的关系 ????????*/ ???????tea1.setStus(students);//因为课程是一个新的,所以根据没有学生 ???????/*新增*/ ???????session.save(tea1); ???????/*事务提交*/ ???????tr.commit(); ???????/* ???????Hibernate: create table Stu (sid bigint not null, tname varchar(255), primary key (sid)) engine=MyISAM ???????Hibernate: create table Tea (tid bigint not null, tname varchar(255), primary key (tid)) engine=MyISAM ???????Hibernate: create table tea_stu (tid bigint not null, sid bigint not null, primary key (sid, tid)) engine=MyISAM ???????Hibernate: alter table tea_stu add constraint FK1lo22k662lgxr7d79rmfajlu3 foreign key (sid) references Stu (sid) ???????Hibernate: alter table tea_stu add constraint FKgq01y04i2r2ye5pd8abh5x42u foreign key (tid) references Tea (tid) ???????Hibernate: select max(tid) from Tea ???????Hibernate: select max(sid) from Stu ???????Hibernate: insert into Tea (tname, tid) values (?, ?) ???????Hibernate: insert into Stu (tname, sid) values (?, ?) ???????Hibernate: insert into Stu (tname, sid) values (?, ?) ???????Hibernate: insert into tea_stu (tid, sid) values (?, ?) ???????Hibernate: insert into tea_stu (tid, sid) values (?, ?) ???????* */ ???}

六,总结:

  我认为此处写的已经足够,最好的学习方法就是尝试,自己来试一下

  我可以提出需求:

    1.保存单个学生

    2.修改一个教师下关联的学生

    3.将一个学生关联的所有教师都干掉

    等等等。。。。。。。。。。。。。

Hibernate-ORM:12.Hibernate中的多对多关联关系

原文地址:https://www.cnblogs.com/DawnCHENXI/p/9124565.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved