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

简介:     ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------       本篇博客将讲述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.将一个学生关联的所有教师都干掉

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

 

目录
相关文章
|
XML SQL Java
Hibernate-ORM:14.Hibernate中的命名查询
      ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------         本篇博客讲述命名查询,所谓命名查询是什么呢? Hibernate中允许我们在xml,实体类,甚至注解的方式来编写查询语句,本篇博客将讲述xml中的方式 一,准备好准备工作,我由于上篇博客把大量的准备都做好,所以,本篇从简 二,预览hbm.
1029 0
|
SQL Java 数据库连接
Hibernate-ORM:15.Hibernate中的Criteria查询
    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------         本篇博客讲师Hibernate中的Criteria查询! 一,Criteria简介:   刚接触Hibernate的时候,就有一个概念,全自动的ORM框架,不用写...
980 0
|
SQL 缓存 Java
Hibernate-ORM:16.Hibernate中的二级缓存Ehcache的配置
    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------         本篇博客讲述Hibernate中的二级缓存的配置,作者将使用的是ehcache缓存 一,目录   1.
1223 0
|
Java 关系型数据库 程序员
Hibernate-ORM:13.Hibernate中的连接查询
    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------     本篇博客将会解释Hibernate中的连接查询(各种join) 一,目录   1.
903 0
|
安全
Hibernate-ORM:09.Hibernate中的getCurrentSession()
  ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------         本篇博客将讲述,以优雅的方式创建session对象,我将会说明优点,并提炼成工具类   优点:   1.
1257 0
|
Java 关系型数据库 MySQL
Hibernate-ORM:10.Hibernate中的分页
  ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------       本篇博客讲述Hibernate中的分页 hibernate中的分页其实很好写,它通过操作对象的方式,来进行分页查询操作 分页无非就是查俩个:1.
938 0
|
Java 关系型数据库 数据库连接
Hibernate-ORM:11.Hibernate中的关联查询
      ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------         本篇博客将讲述Hibernate中的关联查询,及其级联(cascade)操作,以及指定哪一方维护关联关系的(inverse)   一,讲述目录如下:   1.
1196 0
|
缓存 Java 数据库连接
Hibernate-ORM:06.Hibernate中三种状态
  ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------       本篇博客主要叙述Hibernate中的三种状态:临时状态(瞬时状态),持久状态,游离状态 commit和flush三种状态间的使用,commit和flush的区别: save...
1096 0
|
SQL Java 数据库连接
Hibernate-ORM:07.Hibernate中的参数绑定
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------     本篇博客会讲解Hibernate中的参数绑定,就是相当于sql语句中的where后面的条件   一,讲解概述:   1.
1039 0
|
SQL Java 数据库连接
Hibernate-ORM:08.Hibernate中的投影查询
    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------       本篇博客将叙述hibernate中的投影查询 一,目录:   1.解释什么是投影查询   2.
1020 0