In my nest application I have two tables Users and Profession I want to create OneToOne relationship between these two tables. Below code demonstrates how I am achieving it, but it's only saving data in one table which Users and not in Profession table.
user.entity.ts
import { Column, CreateDateColumn, Entity, JoinColumn, OneToOne,
PrimaryGeneratedColumn } from "typeorm";
import { Profession } from "./profession.entity";
@Entity({name:'users'})
export class User {
@PrimaryGeneratedColumn({type: 'bigint'})
id: number;
@Column()
firstName: string;
@Column()
lastName: string;
@Column({ default: true })
isActive: boolean;
@CreateDateColumn()
createdAt: Date
@OneToOne(() => Profession, (prof) => prof.user,{cascade:true})
@JoinColumn()
profession: Profession
}
profession.entity.ts
import { IsNotEmpty, IsInt } from "class-validator";
import { Column, Entity, OneToOne, PrimaryGeneratedColumn } from "typeorm";
import { User } from "./user.entity";
@Entity({name:'profession'})
export class Profession{
@PrimaryGeneratedColumn()
id:number;
@IsNotEmpty({message:"Please enter job type."})
@Column()
job_type:string;
@IsNotEmpty({message:"Please enter experience."})
@IsInt({message:"Invalid type"})
@Column()
experience: number;
@OneToOne(() => User,(use) => use.profession)
user:User;
}
create-user.dto.ts
import { IsBoolean, IsNotEmpty, IsString } from "class-validator";
import { ProfessionDto } from "./profession.dto";
export class CreateUserDto {
@IsNotEmpty({message:"Please enter first name."})
@IsString(({message:"Please enter valid first name."}))
firstName:string;
@IsNotEmpty({message:"Please enter last name."})
@IsString(({message:"Please enter valid last name."}))
lastName:string;
@IsBoolean({message:"Value is not valid."})
isActive:boolean;
profession:ProfessionDto;
}
profession.dto.ts
import { IsNotEmpty } from "class-validator";
export class ProfessionDto {
id:number;
@IsNotEmpty({message:"Please enter job type."})
job_type:string;
@IsNotEmpty({message:"Please enter experience."})
experience:number;
}
user.controller.ts
import { Controller, Post, Body, UsePipes, ValidationPipe } from '@nestjs/common';
import { UserService } from './user.service';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
import { ProfessionDto } from './dto/profession.dto';
@Controller('/api')
export class UserController {
constructor(private readonly userService: UserService) {}
@Post('/addUser')
@UsePipes(ValidationPipe)
create(@Body() createUserDto: CreateUserDto) {
return this.userService.create(createUserDto);
}
}
user.service.ts
import { Injectable } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { InjectRepository } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
import { Repository } from 'typeorm';
@Injectable()
export class UserService {
constructor(
@InjectRepository(User)
private userRepository:Repository<User>,
){}
async create(createUserDto: CreateUserDto) {
let addUser = await this.userRepository.create(createUserDto);
let data = await this.userRepository.insert(addUser);
return {message:"User added successfully"};
}
}
Now with this Users table get populated but Profession table is empty.
Below is I am making POST request in postman:
What exactly am I doing wrong in my code?
You can try use save()
method instead create()
, following the official documentation:
TypeORM One to One