Hibernate多表的关联插入

news2025/1/15 23:47:40

一、一对多关系:

“一”的一方为主表,“多”的一方为副表,主表关联副表,应该在主表中加入副表对象作为属性。
根据顾客ID查询顾客信息 (一) ,同时将顾客名下所有订单查出 (多)

实现思路:
在这里插入图片描述

  • 数据库关系:
    在这里插入图片描述
  • 创建顾客实体类,存储顾客信息:
    注意我们在顾客类中用List集合封装了顾客名下的订单信息。
package org.example.Entity;

import java.util.List;
public class CustomerEntity {
    private int id;
    private String name;
    private Integer age;
    //在顾客表中加入订单集合
    private List<OrdersEntity> orders;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public List<OrdersEntity> getOrders() {
        return orders;
    }

    public void setOrders(List<OrdersEntity> orders) {
        this.orders = orders;
    }
}
  • 创建订单类,存储订单信息:
    订单类中应该有顾客类,用来指明该订单属于哪个顾客。
package org.example.Entity;

public class OrdersEntity {
    private int id;
    private String orderNumber;
    private Double orderPrice;
    //订单中有外键customer_id,所以需要添加顾客类
    private CustomerEntity customer;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getOrderNumber() {
        return orderNumber;
    }

    public void setOrderNumber(String orderNumber) {
        this.orderNumber = orderNumber;
    }

    public Double getOrderPrice() {
        return orderPrice;
    }

    public void setOrderPrice(Double orderPrice) {
        this.orderPrice = orderPrice;
    }

    public CustomerEntity getCustomer() {
        return customer;
    }

    public void setCustomer(CustomerEntity customer) {
        this.customer = customer;
    }
}
  • 创建顾客关系类的映射文件:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="org.example.Entity.CustomerEntity" table="customer" schema="ssm">
        <!--主键-->
        <id name="id" column="id"/>
        <!--非主键-->
        <property name="name" column="name"/>
        <property name="age" column="age"/>
        <!--配置集合属性orders 和表名orders-->
        <set name="orders" table="orders">
            <!--该属性对应的外键-->
            <key column="customer_id"/>
            <!--该外键所属的实体类-->
            <one-to-many class="org.example.Entity.OrdersEntity"/>
        </set>
    </class>
</hibernate-mapping>
  • 创建订单实体类的映射文件:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="org.example.Entity.OrdersEntity" table="orders" schema="ssm">
        <!--主键-->
        <id name="id" column="id"/>
        <!--非主键-->
        <property name="orderNumber" column="orderNumber"/>
        <property name="orderPrice" column="orderPrice"/>
        <!--外键,class是外键对应的实体类-->
        <many-to-one name="customer"  column="customer_id" class="org.example.Entity.CustomerEntity"/>

    </class>
</hibernate-mapping>
  • 测试类:
    注意要建立关联关系。
package org.example;

import org.example.Entity.CustomerEntity;
import org.example.Entity.OrdersEntity;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class AppTest{
    @Test
    public void test(){
        //创建SessionFactory,从根路径下获取核心配置文件
        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
        //创建session
        Session session = factory.openSession();
        //创建事务
        Transaction transaction = session.beginTransaction();
        //创建顾客类对象并给相应属性赋值
        CustomerEntity customer = new CustomerEntity();
        customer.setId(4);
        customer.setName("44");
        customer.setAge(18);
        //创建订单类对象并给相应属性赋值
        OrdersEntity order = new OrdersEntity();
        order.setId(4);
        order.setOrderNumber("4");
        order.setOrderPrice(4.0);
        //建立关联关系,若不建立关联关系order表的数据为空
        order.setCustomer(customer);
        //保存,所有对象都要保存
        session.save(customer);
        session.save(order);
        //提交事务
        transaction.commit();
        //关闭SessionFactory
        factory.close();
    }
}
  • 运行结果:
    在这里插入图片描述

二、多对多关系:

多对多关系通过一个中间表来维护。

实现思路:
在这里插入图片描述

  • 数据库关系:
    在这里插入图片描述
  • 创建Accounts实体类:
package org.example.Entity;

import java.util.Set;

public class AccountsEntity {
    private int aid;
    private String aname;
    private Set<CoursesEntity> courses;

    public int getAid() {
        return aid;
    }

    public void setAid(int aid) {
        this.aid = aid;
    }

    public String getAname() {
        return aname;
    }

    public void setAname(String aname) {
        this.aname = aname;
    }

    public Set<CoursesEntity> getCourses() {
        return courses;
    }

    public void setCourses(Set<CoursesEntity> courses) {
        this.courses = courses;
    }
}

  • 创建Courses实体类:
package org.example.Entity;

import java.util.Set;

public class CoursesEntity {
    private int cid;
    private String cname;
    private Set<AccountsEntity> accounts;

    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 Set<AccountsEntity> getAccounts() {
        return accounts;
    }

    public void setAccounts(Set<AccountsEntity> accounts) {
        this.accounts = accounts;
    }
}
  • 创建中间表实体类:
package org.example.Entity;

public class AccountCourseEntity {
    private int id;
    private Integer aid;
    private Integer cid;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Integer getAid() {
        return aid;
    }

    public void setAid(Integer aid) {
        this.aid = aid;
    }

    public Integer getCid() {
        return cid;
    }

    public void setCid(Integer cid) {
        this.cid = cid;
    }
}
  • 创建Accounts实体类映射文件:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="org.example.Entity.AccountsEntity" table="accounts" schema="ssm">
        <id name="aid" column="aid"/>
        <property name="aname" column="aname"/>
        <set name="courses" table="account_course">
            <key column="aid"/>
            <!--column 属性与中间表的外键字段名对应,这里配的是CoursesEntity在中间表中对应的外键-->
            <many-to-many class="org.example.Entity.CoursesEntity" column="cid"/>
        </set>
    </class>
</hibernate-mapping>
  • 创建Courses实体类映射文件:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="org.example.Entity.CoursesEntity" table="courses" schema="ssm">
        <id name="cid" column="cid"/>
        <property name="cname" column="cname"/>
        <set name="accounts" table="account_course">
            <key column="cid"/>
            <!--column 属性与中间表的外键字段名对应,这里配的是AccountsEntity在中间表中对应的外键-->
            <many-to-many class="org.example.Entity.AccountsEntity" column="aid"/>
        </set>
    </class>
</hibernate-mapping>
  • 创建中间表实体类映射文件:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="org.example.Entity.AccountCourseEntity" table="account_course" schema="ssm">
        <id name="id" column="id"/>
        <property name="aid" column="aid"/>
        <property name="cid" column="cid"/>
    </class>
</hibernate-mapping>
  • 测试类:
package org.example;

import org.example.Entity.AccountsEntity;
import org.example.Entity.CoursesEntity;
import org.example.Entity.CustomerEntity;
import org.example.Entity.OrdersEntity;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import java.util.HashSet;
import java.util.Set;

public class AppTest{

    @Test
    public void test2(){
        //创建SessionFactory,从根路径下获取核心配置文件
        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
        //创建session
        Session session = factory.openSession();
        //创建事务
        Transaction transaction = session.beginTransaction();
        //创建Courses类对象并给相应属性赋值
        CoursesEntity course = new CoursesEntity();
        course.setCname("JAVA");
        //创建Accounts类对象并给相应属性赋值
        AccountsEntity account = new AccountsEntity();
        account.setAname("张三");
        //建立关联关系
        Set<CoursesEntity> courses = new HashSet<>();
        courses.add(course);
        account.setCourses(courses);
        //保存,所有对象都要保存
        session.save(course);
        session.save(account);
        //提交事务
        transaction.commit();
        //关闭SessionFactory
        factory.close();
    }
}
  • 运行结果:
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/24212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

公司建设网站的好处及优势

企业为什么要建网站&#xff1f;企业建站的好处和优势&#xff01;在新的世纪里&#xff0c;互联网将进入一个全新的阶段&#xff0c;信息技术的发展将带动其他行业的发展&#xff0c;所有行业都将与之深度融合和渗透。 越来越多的企业开始从对互联网的认识阶段走向认同和行动…

在关系数据库中允许空值的一些缺点

早在 2020 年&#xff0c;我们就了解了关系数据库系统中的 NULL 值及其用途。正如那篇文章所述&#xff0c;NULL 值已成为一个特殊标记&#xff0c;表示不存在任何数值。你也可以说 NULL 值可能表示列可能有一个值&#xff0c;但是你还不知道该值是什么。在这种情况下&#xff…

Python: 打包发布到PyPi上

经常会碰到python包要打包成sdk放到PyPi上开源的情况。 下面的操作具体参考&#xff1a;https://packaging.python.org/en/latest/tutorials/packaging-projects/。 一、准备 1、pyproject.toml 我的具体如下 [build-system] requires ["setuptools>61.0"] bu…

atguigu8 集群

0. 集群介绍 &#xff08;1&#xff09;集群的目标 • 高可用&#xff08;High Availability&#xff09;&#xff0c;是当一台服务器停止服务后&#xff0c;对于业务及用户毫无影 响。 停止服务的原因可能由于网卡、路由器、机房、CPU负载过高、内存溢出、自 然灾害等不可预…

基于Matlab使用线性FM波形对带状合成孔径雷达系统建模(附源码)

目录 一、合成孔径雷达成像 二、雷达配置 三、场景配置 四、SAR 信号模拟 五、总结 六、程序 此示例说明如何使用线性 FM &#xff08;LFM&#xff09; 波形对基于带状图的合成孔径雷达 &#xff08;SAR&#xff09; 系统进行建模。SAR是一种侧视机载雷达&#xff0c;与真实…

布隆过滤器原理,优缺点

介绍&#xff1a; 位图&#xff1a;int[10]&#xff0c;每个int类型的整数是4*832个bit&#xff0c;则int[10]⼀共有320 bit&#xff0c;每个bit⾮0即1&#xff0c;初始化时都是0 添加数据时&#xff1a;将数据进⾏hash得到hash值&#xff0c;对应到bit位&#xff0c;将该bit改…

Koa.js搭建简单服务器,连接数据库

Koa.js搭建简单服务器&#xff0c;连接数据库1. 环境node v7.6版本以上2. 创建服务安装依赖3. 根目录新建index.js&#xff0c;新建router.js&#xff0c;controller文件夹4. 浏览器访问5. 连接mysql6. 查询测试7、其它1. 环境node v7.6版本以上 2. 创建服务安装依赖 新建文件…

Origin绘制折线图

Origin常用功能见&#xff1a; Origin常用功能_Dezeming的博客-CSDN博客Origin支持各种各样的2D/3D图形。Origin中的数据分析功能包括统计&#xff0c;​信号处理&#xff0c;曲线拟合以及峰值分析。Origin中的曲线拟合是采用基于Levernberg-Marquardt算法&#xff08;LMA&…

软件设计模式复习

一、统一建模语言 1.统一建模语言知识点 二、面向对象设计原则 史上最全设计模式导学目录&#xff08;完整版&#xff09; 三、设计模式概述 1.定义&#xff1a;设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代…

Go 语言报错 StackGuardMultiplier redeclared in this block

前言 最近在 GitHub 刷到了 GitHub - golang-china/gopl-zh: Go语言圣经中文版&#xff0c; 然后又是周末&#xff0c;就起了玩心。搞一个 Go 玩玩&#xff0c;去 The Go Programming Language下载了 Go 语言安装包&#xff0c;一路默认安装。然后打开 VS Code 安装 Extensio…

5个编写技巧,有效提高单元测试实践

1. 什么是单元测试 “在计算机编程中&#xff0c;单元测试又称为模块测试&#xff0c;是针对程序模块来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中&#xff0c;一个单元就是单个程序、函数、过程等&#xff1b;对于面向对象编程&#xff0c;最…

PPT的使用技巧(一):对齐、文字填充、柱状图填充

1、快速对齐 在制作PPT时&#xff0c;需要将绘制的几个图形进行对齐&#xff0c;如果用人工进行对齐&#xff0c;则效果会很差&#xff0c;且耗时严重。如下图所示为未对齐时的情况&#xff0c;可以发现4个矩形在水平、垂直方向均不对其。 我们需要将其进行对齐后变成如下效果…

1. Windows 安装 elasticsearch-8.5.1 和 kibana

1. 准备下载文件 Elasticsearch 下载地址&#xff1a; https://www.elastic.co/downloads/elasticsearch Kibana 下载地址&#xff1a; https://www.elastic.co/downloads/kibana 2.启动es 1、配置文件&#xff1a;注意ip用个人ip别用localhost # Elasticsearch Configur…

面板数据熵值法计算综合指数Stata代码(附样本数据和结果)

面板数据熵值法计算综合指数Stata代码&#xff08;附样本数据和结果&#xff09; 熵值法是指用来判断某个指标的离散程度的数学方法。离散程度越大&#xff0c;该指标对综合评价的影响越大。可以用熵值判断某个指标的离散程度。 在信息论中&#xff0c;熵是对不确定性的一种度…

jasperreports6.12.2 could not load the following font解决方法

jasperreports通过Java代码生成PDF的时候不能获取中文字体&#xff0c;报错提示如下&#xff1a; net.sf.jasperreports.engine.JRRuntimeException: Could not load the following font: pdfFontName: STSong-Light pdfEncoding: Identity-H isPdfEmbedded : true本次环境&…

聊一聊华为云弹性公网IP的那些事儿

聊一聊华为云弹性公网IP的那些事儿 如今&#xff0c;企业上云已成为热门话题&#xff0c;云可以驱动流程创新和业务创新&#xff0c;成为企业新的利润增长点&#xff0c;被看成是企业实现数字化转型的必经之路。弹性公网IP作为一种网络基础能力&#xff0c;也是华为云客户日常…

【Linux】多线程基础

文章目录1.线程的基本概念1.1重定义进程1.2Linux下的线程2.多级页表3.线程VS进程3.1线程的优缺点3.2线程异常3.3线程用途3.4线程与进程的关系4.线程控制4.1线程创建4.2线程等待4.3进程终止4.4线程分离5.线程ID与线程结构1.线程的基本概念 在一个程序里的一个执行路线就叫做线程…

树莓派系统镜像备份

SD卡系统镜像备份引言1、下载镜像备份脚本2、查看sd卡设备名称3、复制镜像4、压缩镜像引言 SD卡系统镜像备份有多种方式&#xff0c;最简单粗暴的是使用Win32diskImager工具&#xff0c;将SD卡的镜像直接读取&#xff0c;但是该种方式最大的缺陷就是读取的镜像空间太大。比如在…

a股level2数据接口的最优委托信息

a股level2数据接口除了提供逐笔成交记录这个信息外&#xff0c;还提供了最优委托信息&#xff0c;也就是盘口中前50笔订单的委托数量明细。 Level-1提供的数据并不可以知道委托了xxx手是有多少人下的&#xff0c;以及每个人下了多少的明细。但是在Level-2中就能显示卖一处前50…

Head First设计模式(阅读笔记)-02.观察者模式

气象监测应用 建立一个应用&#xff0c;利用WeatherData对象取得气象站的数据&#xff0c;并更新三个布告板&#xff1a;目前状况、气象统计和天气预报 要求 WeatherData类具有getter方法获取温度、湿度和气压获取到新的数据时会调用measurementsChanged方法当有新数据时三个布…