广告
返回顶部
首页 > 资讯 > 数据库 >Hibernate框架关系映射
  • 466
分享到

Hibernate框架关系映射

2024-04-02 19:04:59 466人浏览 泡泡鱼
摘要

接触Hibernate也有一小段的时间了,愈发的觉得Hibernate是个神奇的东西,为什么这么说呢?因为你可以不懂一行sql,直接面向对象,就可以将数据直接保存到数据库去!!你还可以保存一个对象,然后一次

接触Hibernate也有一小段的时间了,愈发的觉得Hibernate是个神奇的东西,为什么这么说呢?因为你可以不懂一行sql,直接面向对象,就可以将数据直接保存到数据库去!!

你还可以保存一个对象,然后一次性的将与它相关的所有数据保存到数据库,比如说,你只需要保存班级对象,就可以将该班级信息和该班级下的所有学生在数据库中形成一堆的记录。

而且都不需要你写sql!!!

有木有很神奇。。。。反正宝宝我是惊呆了。

下面就拿具体的代码实现来讲吧~

首先讲一个简单的  单向一对多的案例(以班级和学生作为案例)

众所周知,Hibernate运用的是一种面向对象的思想,我们想要与数据库相关联,首先我们得必须有与之相对应的实体类

比如说,我有一个学生对象和班级对象,分别对应数据库中的学生表和班级表具体信息如下:

Hibernate框架关系映射

  Integer sid;
     String sname;
     String sex;

    .sname =.sex = .sid = .sname = .sex =

Hibernate框架关系映射

 

Hibernate框架关系映射

package entity;import java.io.Serializable;
import java.util.HashSet;
import java.util.List;
import java.util.Set;public class Grade implements Serializable {    private Integer gid;//班级编号
    private String gname;//班级名称
    private String gdesc;//班级描述
    
    public Grade() {
    }    
    public Grade(String gname, String gdesc) {        this.gname = gname;        this.gdesc = gdesc;
    }    public Integer getGid() {        return gid;
    }    public void setGid(Integer gid) {        this.gid = gid;
    }    public String getGname() {        return gname;
    }    public void setGname(String gname) {        this.gname = gname;
    }    public String getGdesc() {        return gdesc;
    }    public void setGdesc(String gdesc) {        this.gdesc = gdesc;
    }
    
    
}

Hibernate框架关系映射

 

一对多的话,应该是比较好理解的,因为我们可以理解为   一个班级可以以对应多个学生,这就是一对多,既然一个班级对应多个学生的话,那么我们是不是就可以在班级的实体类下载

中加入一个学生集合和呢?这样是不是更能体现出一对多的关系呢?所以我们对班级实体就有了下面的改造下载

Hibernate框架关系映射

package entity;

import java.io.Serializable;
import java.util.HashSet;
import java.util.List;
import java.util.Set;public class Grade implements Serializable {    private Integer gid;//年级编号
    private String gname;//年级名称
    private String gdesc;//年级描述    //添加一个班级里的学生集合
    private Set<Student> stus=new HashSet<Student>();    public Set<Student> getStus() {        return stus;
    }    public void setStus(Set<Student> stus) {        this.stus = stus;
    }    public Grade() {
    }    
    public Grade(String gname, String gdesc) {        this.gname = gname;        this.gdesc = gdesc;
    }    public Integer getGid() {        return gid;
    }    public void setGid(Integer gid) {        this.gid = gid;
    }    public String getGname() {        return gname;
    }    public void setGname(String gname) {        this.gname = gname;
    }    public String getGdesc() {        return gdesc;
    }    public void setGdesc(String gdesc) {        this.gdesc = gdesc;
    }
    
    
}

Hibernate框架关系映射

 

实体类写完了,我们就该写最关键的配置文件也就是映射文件了下载(Grade.hbm.xml)

Hibernate框架关系映射

<?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="entity">
    <!-- 实体类和数据表的名称 -->
    <class name="Grade" table="Grade">
        <!-- 实体类中和数据表中所对应的主键 -->
        <id name="gid" column="gid">
            <!-- 主键生成策略  increment是值找到最大的主键 值,并加1 -->
            <generator class="increment" />
        </id>
        <!-- 非主键属性的配置 -->
        <property name="gname" column="gname" />
        <property name="gdesc"  column="gdesc"/>
        
        <!-- 配置多对一配置信息   -->
        <set name="stus" table="Student" >
            <!-- 多方的外建值 -->
            <key column="gid"></key>
            <one-to-many class="entity.Student"/>
        </set>
    </class>
</hibernate-mapping>

Hibernate框架关系映射

 

这样我们就完成了一对多的配置了,此时,我们不用对Student.hbm.xml做任何操作,下面可以测试了下载

Hibernate框架关系映射

//单向一对多案例(一个班级对应多个学生)
    public static void DOneToManyAdd(){        //准备session 
        Session session=HibernateUtil.currentSession();        //开启事务
        Transaction tx = session.beginTransaction();        //创建一个班级
        Grade grade=new Grade("S1261","无敌的Y1261班");        //准备几个学生
        Student stu1=new Student("微热的雪","女");
        Student stu2=new Student("巴黎的雨季","男");        //设置班级里的学生        grade.getStus().add(stu1);
        grade.getStus().add(stu2);        
        //保存        session.save(grade);
        session.save(stu1);
        session.save(stu2);        
        //提交事务        tx.commit();        //关闭连接        HibernateUtil.closeSession();
    }

Hibernate框架关系映射

 

执行这些代码后可以在控制台看到如下信息

Hibernate框架关系映射

这个时候,你的数据库中便有了如下信息

Hibernate框架关系映射

Hibernate框架关系映射

 

可以从上面的测试代码中看出,我并没有手动的指定学生所在的班级,但是因为有映射文件,Hibernate会自动的检索到所在的班级并自行的发送sql语句到数据库进行持久化操作。

这就是Hibernate的强大之处,当然,这只是一个最简单的例子,下面就跟着我看看更加有趣的例子吧!下载

 

 Hibernate关系映射二之   单向多对一关系映射

多对一关系映射也同样的好理解,比如,多个学生可以同时处于一个班级下,这就是单向的多对一的关系,所以我们就可以想到在学生表中加入一个班级属性

Hibernate框架关系映射

package entity;

import java.io.Serializable;public class Student implements Serializable {    private Integer sid;//学生编号
    private String sname;//学生姓名
    private String sex;//学生性别    //创建一个班级
    private Grade grade;    public Grade getGrade() {        return grade;
    }    public void setGrade(Grade grade) {        this.grade = grade;
    }    public Student() {
    }    
    public Student(String sname, String sex) {        this.sname = sname;        this.sex = sex;
    }    public Integer getSid() {        return sid;
    }    public void setSid(Integer sid) {        this.sid = sid;
    }    public String getSname() {        return sname;
    }    public void setSname(String sname) {        this.sname = sname;
    }    public String getSex() {        return sex;
    }    public void setSex(String sex) {        this.sex = sex;
    }
    
    
}

Hibernate框架关系映射

 

 因为是单向的多对一,所以我们只需要在多的一方,也就是学生方的配置文件中进行修改,班级方的配置文件保持原始(也就是没有set标签的时候)

Hibernate框架关系映射

<?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="entity">
    <class name="Student" table="Student">
        <id name="sid" column="sid">
            <generator class="increment" />
        </id>
        <property name="sname" column="sname" />
        <property name="sex"  column="sex"/>
        <!-- 配置多对一的关系映射 -->
        <many-to-one name="grade" class="entity.Grade" column="gid"></many-to-one>
    </class>
</hibernate-mapping>

Hibernate框架关系映射

 

同样,我们做一个单向多对一的添加操作下载

Hibernate框架关系映射

//单向多对一添加案例(多个学生对应一个班级)
    public static void DManyToOneAdd(){        //准备session 
        Session session=HibernateUtil.currentSession();        //开启事务
        Transaction tx = session.beginTransaction();        //创建一个班级
        Grade grade=new Grade("S2222班","挺6的S2222班");        //准备几个学生
        Student stu1=new Student("恩恩","男");
        Student stu2=new Student("呵呵","女");        //设置学生所在的班级        stu1.setGrade(grade);
        stu2.setGrade(grade);        //保存        session.save(grade);
        session.save(stu1);
        session.save(stu2);        //提交事务        tx.commit();        //关闭连接        HibernateUtil.closeSession();
    }

Hibernate框架关系映射

 

注意!!!此时的Hibernate生成的sql语句与一对多时是不一样的!

Hibernate框架关系映射

数据库中同样也是有相对应的记录

 

经过上面两个案例的展示,可能有同学就会有疑问了,既然多个学生可以属于一个班级,一个班级又可以有多个学生,那么他们俩之间到底可以设为 什么关系呢?

此时,我们就可以设置为  双向的一对多的关系了。因为班级和学生是一个双向的关系,而且一个班级又有多个学生

这时我们完整的配置文件就是以上的两个总和了

Student.hbm.xml

Hibernate框架关系映射

<?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="entity">
    <class name="Student" table="Student">
        <id name="sid" column="sid">
            <generator class="increment" />
        </id>
        <property name="sname" column="sname" />
        <property name="sex"  column="sex"/>
        <!-- 配置多对一的关系映射 -->
        <many-to-one name="grade" class="entity.Grade" column="gid" ></many-to-one>
    </class>
</hibernate-mapping>

Hibernate框架关系映射

 

Grade.hbm.xml

Hibernate框架关系映射

<?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="entity">
    <!-- 实体类和数据表的名称 -->
    <class name="Grade" table="Grade">
        <!-- 实体类中和数据表中所对应的主键 -->
        <id name="gid" column="gid">
            <!-- 主键生成策略  increment是值找到最大的主键 值,并加1 -->
            <generator class="increment" />
        </id>
        <!-- 非主键属性的配置 -->
        <property name="gname" column="gname" />
        <property name="gdesc"  column="gdesc"/>
        
        <!-- 配置多对一配置信息   -->
        <set name="stus" table="Student"  >
            <!-- 多方的外建值 -->
            <key column="gid"></key>
            <one-to-many class="entity.Student"/>
        </set>
    </class>
</hibernate-mapping>

Hibernate框架关系映射

 

测试数据

Hibernate框架关系映射

//双向添加案例
    private static void SAdd(){        //准备session 
        Session session=HibernateUtil.currentSession();        //开启事务
        Transaction tx = session.beginTransaction();        //创建一个班级
        Grade grade=new Grade("S2222班","挺6的S2222班");        //准备几个学生
        Student stu1=new Student("巴黎的雨季","男");
        Student stu2=new Student("微热的雪","女");        //设置班级下的学生        grade.getStus().add(stu1);
        grade.getStus().add(stu2);        //为学生设置班级        stu1.setGrade(grade);
        stu2.setGrade(grade);        //保存        session.save(grade);
            session.save(stu1);
        session.save(stu2);        //提交事务        tx.commit();        
        //关闭连接        HibernateUtil.closeSession();
    }

Hibernate框架关系映射

 

细心的同学会发现,当我执行了上面的代码时,效果与我设置多对一和一对多的效果一样,而且这还比较的繁琐和复杂,所以这并不是双向关系的优势

这里我们就要用到cascade(级联)的属性了   设置级联的属性后,因为有 双向的关系,所以当你只添加班级的时候Hibernate会自动的添加班级下的学生

Student.hbm.xml  下载

 

Hibernate框架关系映射

<?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="entity">
    <class name="Student" table="Student">
        <id name="sid" column="sid">
            <generator class="increment" />
        </id>
        <property name="sname" column="sname" />
        <property name="sex"  column="sex"/>
        <!-- 配置多对一的关系映射 -->
        <many-to-one name="grade" class="entity.Grade" column="gid" cascade="all"></many-to-one>
    </class>
</hibernate-mapping>

Hibernate框架关系映射

 

Grade.hbm.xml

Hibernate框架关系映射

<?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="entity">
    <!-- 实体类和数据表的名称 -->
    <class name="Grade" table="Grade">
        <!-- 实体类中和数据表中所对应的主键 -->
        <id name="gid" column="gid">
            <!-- 主键生成策略  increment是值找到最大的主键 值,并加1 -->
            <generator class="increment" />
        </id>
        <!-- 非主键属性的配置 -->
        <property name="gname" column="gname" />
        <property name="gdesc"  column="gdesc"/>
        
        <!-- 配置多对一配置信息   -->
        <set name="stus" table="Student" cascade="all" inverse="true">
            <!-- 多方的外建值 -->
            <key column="gid"></key>
            <one-to-many class="entity.Student"/>
        </set>
    </class>
</hibernate-mapping>

Hibernate框架关系映射

 

 这样当我们设置级联的属性后,测试代码如下

Hibernate框架关系映射

//双向添加案例(添加班级自动添加班级下的学生)
    private static void SAdd(){        //准备session 
        Session session=HibernateUtil.currentSession();        //开启事务
        Transaction tx = session.beginTransaction();        //创建一个班级
        Grade grade=new Grade("S2222班","挺6的S2222班");        //准备几个学生
        Student stu1=new Student("巴黎的雨季","男");
        Student stu2=new Student("微热的雪","女");        //设置班级下的学生        grade.getStus().add(stu1);
        grade.getStus().add(stu2);        //为学生设置班级        stu1.setGrade(grade);
        stu2.setGrade(grade);        //保存(设置级联属性,自动关联该班级下的学生)        session.save(grade);    
        
        //提交事务        tx.commit();        
        //关闭连接        HibernateUtil.closeSession();
    }

Hibernate框架关系映射

 

这样,我们只用写save(grade) 保存班级,这时Hibernate会生成如下代码

Hibernate框架关系映射


您可能感兴趣的文档:

--结束END--

本文标题: Hibernate框架关系映射

本文链接: https://www.lsjlt.com/news/45500.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Hibernate框架关系映射
    接触Hibernate也有一小段的时间了,愈发的觉得Hibernate是个神奇的东西,为什么这么说呢?因为你可以不懂一行sql,直接面向对象,就可以将数据直接保存到数据库去!!你还可以保存一个对象,然后一次...
    99+
    2022-10-18
  • hibernate 一对多 关系映射
    在关系中,或多或少的表之间有复杂的关联关系这里测试 一对多 关联关系的配置开发步骤就不多说了。直接看一个示例。users 用户 和  shop商品订单表分析:一个用户可以有多个商品订单,一个订单只...
    99+
    2022-10-18
  • hibernate 多对多关系映射
    学生 和 课程就是一种多对多的关系映射,那么再hibernate中,对于多对多关系在怎么配置?和一些注意的事项?简单测试下。建表实体配置文件和映射测试1。使用oracle ,建表sqlcreate ...
    99+
    2022-10-18
  • hibernate中的对象关系映射
    Hibernate的本质就是对象关系映射(ObjectRelational Mapping),ORM实现了将对象数据保存到数据库中,以前我们对关系表进行操作,执行增删改查等任务,现在我们不再对关系表进行操作,而是直接对对象操作。hibern...
    99+
    2023-05-31
    hibernate 映射 te
  • 【MyBatis框架】关联映射
    关系映射 1. 关联映射概述2. 环境搭建3.处理字段名和属性名不一致的情况4. 处理一对一映射5. 处理多对一映射5.1 级联方式处理5.2 使用association处理映射关系5.3 分...
    99+
    2023-10-28
    mybatis java 数据库
  • Hibernate映射之基本类映射和对象关系映射详解
    回想一些我们在没有学习ssh的时候,我们建立数据库的表时,首先是数据库建模E-R图,然后再通过实体模型来建立关系模型,再建立相应的表。实体间存在三种关系,一对一,一对多(或者说多对一),多对多。而如今我们要根据类来映射相应的表,那只能是通过...
    99+
    2023-05-31
    hibernate 对象 映射
  • Hibernate对象关系映射举例分析
    本篇内容介绍了“Hibernate对象关系映射举例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!同样由于Hibernate官方文档的影响...
    99+
    2023-06-17
  • Hibernate映射一对多关联关系是什么
    这篇文章主要讲解了“Hibernate映射一对多关联关系是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Hibernate映射一对多关联关系是什么”吧!在域模型中,类和类之间最普通的关系...
    99+
    2023-06-17
  • Hibernate映射关联是什么
    这篇文章主要讲解了“Hibernate映射关联是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Hibernate映射关联是什么”吧!Hibernate映射关联关系和我们现实世界里事物的关...
    99+
    2023-06-17
  • 浅谈hibernate中多表映射关系配置
    1.one-to-many 一对多关系的映射配置(在一的一方实体映射文件中配置)<!-- cascade属性:级联操作属性 save-update: 级联保存,保存客户时,级联保存客户关联的联系人 delete:级联...
    99+
    2023-05-31
    hibernate 多表 映射关系
  • Hibernate如何使用hbm.xml配置映射关系
    这篇文章将为大家详细讲解有关Hibernate如何使用hbm.xml配置映射关系,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在使用hibernate时,经常需要配置与类对应的hbm.xml文件,并在其中...
    99+
    2023-05-30
    hibernate
  • Hibernate继承关系树的映射方式是什么
    这篇文章主要介绍“Hibernate继承关系树的映射方式是什么”,在日常操作中,相信很多人在Hibernate继承关系树的映射方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Hibernate继承关系...
    99+
    2023-06-17
  • Java Hibernate中一对多和多对多关系的映射方式
    目录Hibernate的一对多和多对多Hibernate的一对多Hibernate的一对多配置Hibernate的一对多操作Hibernate的多对多Hibernate的多对多配置H...
    99+
    2023-05-18
    Java Hibernate一对多 Java Hibernate多对多
  • SpringBoot如何整合Dozer映射框架
    今天小编给大家分享一下SpringBoot如何整合Dozer映射框架的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. Do...
    99+
    2023-07-02
  • 配置ABP框架使用对象映射
    目录DTO和实体实体DTO麻烦的映射AutoMapper 集成IObjectMapper/ObjectMapper对象拓展DTO和实体 实体 实体是领域驱动设计(Domain Dri...
    99+
    2022-11-13
  • SpringBoot整合Dozer映射框架流程详解
    目录1. Dozer 介绍2. 为什么要使用映射框架 Dozer3. Dozer 映射框架的使用1. Dozer 介绍 Dozer 是一个 Java Bean 到 Java Bean...
    99+
    2022-11-13
  • python脚本框架webpy的url映射详解
    目录实例问题URL完全匹配(具体的url) /index URL模糊匹配(你根本就不知道index后面是什么,它根本不会返回参数) /index/\d URL带组匹配(主要有...
    99+
    2022-11-12
  • 详解hibernate双向多对多关联映射XML与注解版
    双向多对多关联映射原理:假设,一个员工可能有多个角色,一个角色可能有多个员工,从员工或角色的角度看,这就是多对多的关系,不管从哪一个角度看,都是多对多的联系。多对多关联映射关系一般采用中间表的形式来实现,即新增一种包含关联双方主键的表。实现...
    99+
    2023-05-31
    hibernate 映射 te
  • 如何配置ABP框架使用对象映射
    小编给大家分享一下如何配置ABP框架使用对象映射,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!DTO和实体实体实体是领域驱动设计(Domain Driven De...
    99+
    2023-06-29
  • 关于MyBatis中映射对象关系的举例
    目录MyBatis映射对象关系双向many2one/one2many关系中的组合关系(级联)Mybatis映射原理MyBatis映射对象关系 双向many2one/one2many关...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作