javascriptmysqlnode.jsnestjstypeorm

Unable to setup One to One relationship in NestJs using TypeORM and mysql


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:

enter image description here

What exactly am I doing wrong in my code?


Solution

  • You can try use save() method instead create(), following the official documentation: TypeORM One to One