当前位置: 首页 > news >正文

OneToMany 和 ManyToOne

在使用 ORM(如 TypeORM)进行实体关系设计时,@OneToMany@ManyToOne 是非常重要的注解,常用来表示两个实体之间的一对多关系。下面通过例子详细说明它们的使用场景和工作方式。


@OneToMany@ManyToOne 的基本概念

  1. @ManyToOne
    表示 “多” 的一方指向 “一” 的一方。它总是定义在关系的 “多” 一侧。

    • 数据库中通常对应一个外键列。
    • 该装饰器是关系的拥有方,负责维护外键。
  2. @OneToMany
    表示 “一” 的一方指向 “多” 的一方。它总是定义在关系的 “一” 一侧。

    • 数据库中没有直接对应的列,而是反向映射。
    • 必须与 @ManyToOne 配合使用,不能单独存在。

示例:用户与文章的关系

场景:

  • 一个用户可以拥有多篇文章。
  • 每篇文章属于一个用户。
1. 实体设计
User 实体
import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';
import { Article } from './article.entity';@Entity()
export class User {@PrimaryGeneratedColumn()id: number;@Column()name: string;// 一个用户拥有多篇文章@OneToMany(() => Article, (article) => article.author)articles: Article[];
}
Article 实体
import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from 'typeorm';
import { User } from './user.entity';@Entity()
export class Article {@PrimaryGeneratedColumn()id: number;@Column()title: string;@ManyToOne(() => User, (user) => user.articles, { onDelete: 'CASCADE' })author: User; // 每篇文章属于一个用户
}

2. 数据库结构

根据上述实体,TypeORM 将生成以下表结构:

User

idname
1Alice
2Bob

Article

idtitleauthorId
1First Post1
2Second Post1
3Third Post2

3. 插入数据
创建用户和文章
const userRepository = dataSource.getRepository(User);
const articleRepository = dataSource.getRepository(Article);// 创建用户
const user = userRepository.create({ name: 'Alice' });
await userRepository.save(user);// 创建文章
const article1 = articleRepository.create({ title: 'First Post', author: user });
const article2 = articleRepository.create({ title: 'Second Post', author: user });
await articleRepository.save([article1, article2]);

4. 查询数据
查询用户的文章
const userWithArticles = await userRepository.findOne({where: { id: 1 },relations: ['articles'],
});console.log(userWithArticles);

输出:

{"id": 1,"name": "Alice","articles": [{ "id": 1, "title": "First Post" },{ "id": 2, "title": "Second Post" }]
}
查询文章及其作者
const articleWithAuthor = await articleRepository.findOne({where: { id: 1 },relations: ['author'],
});console.log(articleWithAuthor);

输出:

{"id": 1,"title": "First Post","author": { "id": 1, "name": "Alice" }
}

关键点总结

  1. @ManyToOne 是外键的维护者

    • 它在数据库中定义外键列(如 authorId)。
    • 用于指向关系的 “一” 侧。
  2. @OneToMany 是关系的反向映射

    • 它没有单独的数据库列。
    • 它仅用作 @ManyToOne 的反向映射,表示 “一” 侧可以访问所有 “多” 侧的记录。
  3. relations 必须手动加载

    • TypeORM 默认不会加载关联字段,需在查询时指定 relations
  4. cascade 选项

    • cascade: true 允许保存或删除时级联操作(如在保存用户时自动保存其文章)。

相关文章:

OneToMany 和 ManyToOne

在使用 ORM(如 TypeORM)进行实体关系设计时,OneToMany 和 ManyToOne 是非常重要的注解,常用来表示两个实体之间的一对多关系。下面通过例子详细说明它们的使用场景和工作方式。 OneToMany 和 ManyToOne 的基本概念 ManyToOne 表示…...

《生成式 AI》课程 第3講 CODE TASK 任务3:自定义任务的机器人

课程 《生成式 AI》课程 第3講:訓練不了人工智慧嗎?你可以訓練你自己-CSDN博客 我们希望你创建一个定制的服务机器人。 您可以想出任何您希望机器人执行的任务,例如,一个可以解决简单的数学问题的机器人0 一个机器人&#xff0c…...

反转链表、链表内指定区间反转

反转链表 给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。 如当输入链表{1,2,3}时,经反转后,原链表变…...

Debezium系列之:Debezium3版本使用快照过程中的指标

Debezium系列之:Debezium3版本使用快照过程中的指标 一、背景二、技术原理三、增量快照四、阻塞快照指标一、背景 使用快照技术的过程中可以观察指标,从而确定快照的进度二、技术原理 Debezium系列之:Debezium 中的增量快照Debezium系列之:Incremental snapshotting设计原理…...

第一讲,Opencv计算机视觉基础之计算机视觉概述

深度剖析计算机视觉:定义、任务及未来发展趋势 引言 计算机视觉(Computer Vision)是人工智能的重要分支之一,旨在让机器通过视觉感知和理解环境。随着深度学习的快速发展,计算机视觉在自动驾驶、安防监控、医疗影像等…...

数据结构(双向链表——c语言实现)

双向链表相比于单向链表的优势: 1. 双向遍历的灵活性 双向链表:由于每个节点都包含指向前一个节点和下一个节点的指针,因此可以从头节点遍历到尾节点,也可以从尾节点遍历到头节点。这种双向遍历的灵活性使得在某些算法和操作中&a…...

【新人系列】Python 入门(十一):控制结构

✍ 个人博客:https://blog.csdn.net/Newin2020?typeblog 📝 专栏地址:https://blog.csdn.net/newin2020/category_12801353.html 📣 专栏定位:为 0 基础刚入门 Python 的小伙伴提供详细的讲解,也欢迎大佬们…...

群核科技首次公开“双核技术引擎”,发布多模态CAD大模型

11月20日,群核科技在杭州举办了第九届酷科技峰会。现场,群核科技首次正式介绍其技术底层核心:基于GPU高性能计算的物理世界模拟器。并对外公开了两大技术引擎:群核启真(渲染)引擎和群核矩阵(CAD…...

【AI大模型引领变革】探索AI如何重塑软件开发流程与未来趋势

文章目录 每日一句正能量前言流程与模式介绍【传统软件开发 VS AI参与的软件开发】一、传统软件开发流程与模式二、AI参与的软件开发流程与模式三、AI带来的不同之处 结论 AI在软件开发流程中的优势、挑战及应对策略AI在软件开发流程中的优势面临的挑战及应对策略 结论 后记 每…...

linux 常用命令指南(存储分区、存储挂载、docker迁移)

前言:由于目前机器存储空间不够,所以‘斥巨资’加了一块2T的机械硬盘,下面是对linux扩容的一系列操作,包含了磁盘空间的创建、删除;存储挂载;docker迁移;anaconda3迁移等。 一、存储分区 1.1 …...

用pyspark把kafka主题数据经过etl导入另一个主题中的有关报错

首先看一下我们的示例代码 import os from pyspark.sql import SparkSession import pyspark.sql.functions as F """ ------------------------------------------Description : TODO:SourceFile : etl_stream_kafkaAuthor : zxxDate : 2024/11/…...

Redis的过期删除策略和内存淘汰机制以及如何保证双写的一致性

Redis的过期删除策略和内存淘汰机制以及如何保证双写的一致性 过期删除策略内存淘汰机制怎么保证redis双写的一致性?更新策略先删除缓存后更新数据库先更新数据库后删除缓存如何选择?如何保证先更新数据库后删除缓存的线程安全问题? 过期删除策略 为了…...

异常处理:import cv2时候报错No module named ‘numpy.core.multiarray‘

问题描述 执行一个将视频变成二值视频输出时候,报错。No module named numpy.core.multiarray,因为应安装过了numpy,所以比较不解。试了卸载numpy和重新安装numpy多次操作,也进行了numpy升级的操作,但是都没有用。 解…...

C++手写PCD文件

前言 一般pcd读写只需要调pcl库接口,直接用pcl的结构写就好了 这里是不依赖pcl库的写入方法 主要是开头写一个header 注意字段大小,类型不要写错     结构定义 写入点需要与header中定义一致 这里用的RoboSense的结构写demo 加了个1字节对齐 stru…...

优选算法(双指针)

1.双指针介绍 双指针算法是一种常用的算法思想,特别适用于处理涉及阵列、链表或字符串等线性数据结构的问题。通过操作两个一个指针来进行导航或操作数据结构,双指针可以最大程度优化解决方案的效率。提高效率并减少空间复杂度。 在Java中使用双指针的核…...

【保姆级】Mac上IDEA卡顿优化

保姆级操作,跟着操作即可~~~ 优化内存 在你的应用程序中,找到你的idea 按住control键+单击 然后点击“显示包内容” </...

python实战案例----使用 PyQt5 构建简单的 HTTP 接口测试工具

python实战案例----使用 PyQt5 构建简单的 HTTP 接口测试工具 文章目录 python实战案例----使用 PyQt5 构建简单的 HTTP 接口测试工具项目背景技术栈用户界面核心功能实现结果展示完整代码总结 在现代软件开发中&#xff0c;测试接口的有效性与响应情况变得尤为重要。本文将指导…...

pytest 接口串联场景

在编写接口测试时&#xff0c;如果有多个接口需要串联在一起调用&#xff0c;并且这些接口共同构成了一个业务场景&#xff0c;通常可以使用以下几种方法来组织代码&#xff0c;使其更具可读性和维护性。以下是一些规范的建议&#xff1a; 1. 使用 pytest 的 fixture 来管理接…...

Springboot项目搭建(2)-用户详细信息查询

1. 提要信息 1.1 java四类八种 在Java中&#xff0c;四类指的是Java中的基本数据类型和引用数据类型&#xff1a; 基本数据类型&#xff1a;Java提供了八种基本数据类型&#xff0c;包括整数型、浮点型、字符型和布尔型。引用数据类型&#xff1a;指向对象的引用&#xff0c…...

Stable Diffusion的加噪和去噪详解

SD模型原理&#xff1a; Stable Diffusion概要讲解Stable diffusion详细讲解Stable Diffusion的加噪和去噪详解Diffusion ModelStable Diffusion核心网络结构——VAEStable Diffusion核心网络结构——CLIP Text EncoderStable Diffusion核心网络结构——U-NetStable Diffusion中…...

CVPR2021_PLOP 论文代码环境搭建步骤

安装cuda 10.2 wget http://developer.download.nvidia.com/compute/cuda/10.2/Prod/local_installers/cuda_10.2.89_440.33.01_linux.run sudo sh cuda_10.2.89_440.33.01_linux.run #只选择 cudatoolkit 安装conda 换源&#xff0c;北外源比较快 参考&#xff1a; https://mi…...

RevokeMsgPatcher:微信/QQ/TIM防撤回补丁工具完全指南

RevokeMsgPatcher&#xff1a;微信/QQ/TIM防撤回补丁工具完全指南 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://gitcode.co…...

还在手动找媒体发稿?看我们团队如何用AI工具把宣发效率提升300%

大家好&#xff0c;我是某互联网公司的技术负责人老王。最近团队上线了一个新项目&#xff0c;市场部的同事跑来问我&#xff0c;能不能帮忙解决下媒介宣发的问题。他们说&#xff0c;每次发个新闻稿或者产品软文&#xff0c;都得一个个去联系媒体、求小编&#xff0c;价格不透…...

Java 数字校验实战:从工具类到正则,性能与场景的深度抉择

1. 数字校验的常见场景与挑战 在Java开发中&#xff0c;数字校验是个看似简单却暗藏玄机的基础操作。我见过太多项目因为数字校验不严谨导致的数据异常&#xff0c;比如用户输入"12a3"被误认为金额&#xff0c;或者接口接收"-1.2.3"这样的非法浮点数。这些…...

Applite:Mac软件管理的图形化革命,告别命令行操作

Applite&#xff1a;Mac软件管理的图形化革命&#xff0c;告别命令行操作 【免费下载链接】Applite User-friendly GUI macOS application for Homebrew Casks 项目地址: https://gitcode.com/gh_mirrors/ap/Applite 还在为Mac软件安装更新而烦恼吗&#xff1f;Applite作…...

百度首页网页图片更多当AI开始写测试用例,手工测试工程师的护城河在哪里?

一、 第一道护城河&#xff1a;从“用例执行者”到“策略设计者”AI可以基于需求文档和历史数据&#xff0c;瞬间生成海量测试用例。但它无法回答一个根本性的问题&#xff1a;我们究竟应该测试什么&#xff1f;测试策略的设计&#xff0c;是在有限的时间和资源下&#xff0c;对…...

Hermes-Agent 智能体核心能力与实战效能深度评测

在构建自动化工作流或智能客服系统时&#xff0c;开发者最常遇到的痛点往往不是模型本身不够聪明&#xff0c;而是“记不住”和“乱执行”。很多时候&#xff0c;一个智能体在前几轮对话中还逻辑清晰&#xff0c;一旦上下文拉长&#xff0c;就开始遗忘关键约束&#xff0c;或者…...

Adobe-GenP 3.0:Adobe CC通用补丁工具终极完整指南

Adobe-GenP 3.0&#xff1a;Adobe CC通用补丁工具终极完整指南 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe-GenP 3.0是一款功能强大的Adobe CC通用补丁工具…...

从手机5G到智能声呐:LMS自适应波束形成算法在真实场景里是怎么用的?

从手机5G到智能声呐&#xff1a;LMS自适应波束形成算法的工程实践 当你在嘈杂的会议室里对着智能音箱说话时&#xff0c;它为何能精准捕捉你的声音而忽略背景噪音&#xff1f;当5G基站需要同时服务数百个移动设备时&#xff0c;又是如何避免信号相互干扰&#xff1f;这些看似毫…...

收藏!AI时代程序员是消失还是逆袭?小白程序员必看大模型逆袭指南

收藏&#xff01;AI时代程序员是消失还是逆袭&#xff1f;小白程序员必看大模型逆袭指南 文章探讨了AI对程序员行业的影响&#xff0c;指出AI抢走了程序员一半的饭碗&#xff0c;但也为另一半人打开了高阶职场的大门。初级岗位因AI工具普及而面临失业风险&#xff0c;但高级技术…...