当前位置: 首页 > 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/592061.html

相关文章:

  • 泉州网站建设培训机构xhinacd.wordpress
  • 公司网站定位建议wordpress导航文件夹
  • 贵阳两学一做网站世界500强企业名录
  • 网站制作找云优化网络安装公司
  • 抚顺网站开发招聘个人工商户做网站要上税吗
  • 国内建网站流程开网店需要什么准备
  • 海珠建设网站2345浏览器官方网站
  • 企业做网页还是网站企业网页是什么
  • 上海网站建设维护网站底部导航设置
  • 后台网站设计WordPress要学多久
  • 驻马店制作网站的公司培训网站建设机构
  • 科技类网站色彩搭配什么行业做网站搜索
  • 防网站黑客网站推广优化c重庆
  • 建筑工程招标网站黑镜wordpress主题
  • 网站用什么格式的图片格式wordpress改页面宽度
  • 花都营销型网站建设公司成都网站建设哪家好
  • 盛泽建设局网站小公司网络组建
  • 东莞市美时家具营销型网站广东seo站外推广折扣
  • 大学专业网站做内容网站好累
  • 社团的工商年检网站在哪里做临沂网站改版
  • 石家庄网站制作报价开发一个手机软件app需要多少钱
  • 一个网站有几个快照江苏苏州有什么好玩的
  • 福州最好的网站设计服务公司安徽汽车网网站建设
  • 做阿里巴巴网站需要多少钱免费制作永久企业网站
  • 网站建设go你会回来感谢我的正能量视频
  • 营销型 手机网站重庆建设工程信息网安管监督
  • 画册设计网站推荐WordPress产品录入
  • 长沙口碑好的做网站公司哪家好为什么公司网站打不开
  • 网站毕业设计论文模板南充市房产信息网官网
  • app网站与普通网站的区别公司二次开发好吗