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

东城网站设计东莞海天网站建设

东城网站设计,东莞海天网站建设,免费动态域名解析软件,织梦做的网站用什么数据库OneToOne 是 TypeORM 中用于定义实体间一对一关系的装饰器,适用于两个实体间存在严格唯一对应关系的场景(如用户与身份证、订单与发票)。以下是其核心用法和关键配置: 基础用法 1. 单向一对一关系 场景:仅在一个实体中…

@OneToOne 是 TypeORM 中用于定义实体间一对一关系的装饰器,适用于两个实体间存在严格唯一对应关系的场景(如用户与身份证、订单与发票)。以下是其核心用法和关键配置:

基础用法

1. 单向一对一关系

场景:仅在一个实体中定义对另一个实体的引用。

// User.entity.ts
import { Entity, PrimaryGeneratedColumn, Column, OneToOne } from 'typeorm';
import { Profile } from './Profile.entity';@Entity()
export class User {@PrimaryGeneratedColumn()id: number;@Column()name: string;// 单向关联(User 知道 Profile,但 Profile 不知道 User)@OneToOne(() => Profile)profile: Profile;
}// Profile.entity.ts
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';@Entity()
export class Profile {@PrimaryGeneratedColumn()id: number;@Column()bio: string;
}

数据库结果

  • User 表会新增一个外键列(如 profileId),指向 Profile 表的主键。

2. 双向一对一关系

场景:两个实体相互引用对方,需通过 @JoinColumn 指定关系所有者。

// User.entity.ts
import { Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm';
import { Profile } from './Profile.entity';@Entity()
export class User {@PrimaryGeneratedColumn()id: number;@Column()name: string;// 双向关联(User 是关系所有者)@OneToOne(() => Profile, (profile) => profile.user)@JoinColumn() // 必须指定,否则会报错profile: Profile;
}// Profile.entity.ts
import { Entity, PrimaryGeneratedColumn, Column, OneToOne } from 'typeorm';
import { User } from './User.entity';@Entity()
export class Profile {@PrimaryGeneratedColumn()id: number;@Column()bio: string;// 反向引用(非必须,但推荐以支持双向查询)@OneToOne(() => User, (user) => user.profile)user: User;
}

数据库结果

  • 外键列仅在关系所有者(User)的表中生成(如 profileId)。

关键配置

1. @JoinColumn 详解

  • 作用:指定关系所有者,并定义外键列名。
  • 必填性:在双向关系中,必须在关系所有者一侧添加。
  • 自定义外键名
    @OneToOne(() => Profile, (profile) => profile.user)
    @JoinColumn({ name: 'custom_profile_id' }) // 自定义外键列名
    profile: Profile;
    

2. 级联操作(Cascade)

通过 cascade 选项自动管理关联实体的生命周期:

@OneToOne(() => Profile, (profile) => profile.user, {cascade: true, // 自动保存/更新/删除关联实体onDelete: 'CASCADE', // 数据库级联删除(可选)
})
@JoinColumn()
profile: Profile;

3. 通过主键关联(类似 JPA @MapsId

场景:当关联实体的外键与主键相同时(如 Client.id = User.id)。

// Client.entity.ts
import { Entity, PrimaryColumn, OneToOne, JoinColumn } from 'typeorm';
import { User } from './User.entity';@Entity()
export class Client {@PrimaryColumn() // 必须使用 @PrimaryColumn 而非 @PrimaryGeneratedColumnid: number;@OneToOne(() => User, { primary: true }) // primary: true 表示通过主键关联@JoinColumn({ name: 'id' }) // 外键列名与主键相同user: User;
}

查询操作

1. 加载关联数据

  • 隐式加载(需配置 eager: true):
    @OneToOne(() => Profile, (profile) => profile.user, { eager: true })
    profile: Profile;
    
  • 显式加载(推荐):
    const user = await userRepository.find({relations: ['profile'], // 加载关联的 profile
    });
    

2. 查询构建器(QueryBuilder)

const user = await userRepository.createQueryBuilder('user').leftJoinAndSelect('user.profile', 'profile') // 左连接并选择 profile.where('user.id = :id', { id: 1 }).getOne();

完整示例

// User.entity.ts
import { Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm';
import { Profile } from './Profile.entity';@Entity()
export class User {@PrimaryGeneratedColumn()id: number;@Column()name: string;@OneToOne(() => Profile, (profile) => profile.user, {cascade: true,onDelete: 'CASCADE',})@JoinColumn()profile: Profile;
}// Profile.entity.ts
import { Entity, PrimaryGeneratedColumn, Column, OneToOne } from 'typeorm';
import { User } from './User.entity';@Entity()
export class Profile {@PrimaryGeneratedColumn()id: number;@Column()bio: string;@OneToOne(() => User, (user) => user.profile)user: User;
}// 使用示例
async function createUserWithProfile() {const profile = new Profile();profile.bio = 'TypeORM Expert';const user = new User();user.name = 'Alice';user.profile = profile; // 自动级联保存await userRepository.save(user);
}async function getUserWithProfile(id: number) {const user = await userRepository.findOne({where: { id },relations: ['profile'], // 加载关联数据});console.log(user?.profile?.bio); // 输出: TypeORM Expert
}

常见问题

  1. 外键列未生成

    • 检查是否在关系所有者一侧添加了 @JoinColumn
    • 确保实体已正确同步到数据库(运行迁移或重新启动应用)。
  2. 循环依赖

    • 避免在双向关系的装饰器回调中直接引用对方实体(如 @OneToOne(() => Profile, (profile) => profile.user) 是安全的,但循环导入模块会导致问题)。
  3. 性能优化

    • 对频繁查询的关联数据使用 eager: true@RelationId 装饰器。
    • 对复杂查询使用 QueryBuilder 以减少 N+1 问题。
http://www.dtcms.com/a/542572.html

相关文章:

  • 织梦网站环境网页设计初学者公司网页设计模板
  • 营销网站优化seo二级域名ip查询
  • 企业官网型网站模板棋牌推广如何精准引流
  • 什么是住宅IP,住宅IP应用场景有哪些
  • 深圳龙岗区网站建设哪些网站可以免费申请
  • 免费商用自媒体图片网站小程序模板修改教程
  • 网站支付的功能如何做信阳seo
  • 5.2 大数据方法论与实践指南-存储元数据治理
  • 苹果ios在线签名ipa应用检测工具,制作实现参考方案
  • 建设个网站广州分销系统开发多少费用
  • 混沌鸿蒙网站建设英文旅游网站建设
  • 网站技术维护成都旅游线路
  • LeetCode 409 - 最长回文串 | Swift 实战题解
  • 网站免费空间免备案泰安网站建设介绍
  • 重庆企业型网站建设西安做公司网站公司
  • Rust语言入门指南:从零掌握系统编程未来
  • 霸州网站制作WordPress评级主题
  • 制作网站设计的技术有网站建设回访
  • 宣城做w网站的公司做网页赚钱
  • 产品网站怎么做超链接ppt软件
  • 哪些网站是用wordpress返佣贵金属交易所网站建设
  • 驻马店专业网站建设我附近的广告公司
  • Redis Cluster 手动部署
  • 单页网站建设服务好的商家关键词优化排名的步骤
  • 做网站推广有什么升职空间十大永久免费网络游戏
  • 关于澳洲WHV工作一些岗位
  • 唐山快速建站公司wordpress数字链接出现404
  • wordpress网站会员太多产品单页设计模板
  • 电子电力技术的全桥LLC谐振变换器学习记录分享1
  • 公司网站邮箱费用wordpress 文章索引插件