Typeorm новой записи не присваивается айдишник новой записи связанной сущности

Рейтинг: 1Ответов: 2Опубликовано: 05.03.2023

Есть две связанные сущности: юзер и его контакты. При создании нового юзера его контакты тоже новые (т.к. уникальные). Запись в базе юзера успешно создается. Для контактов тоже, но у них отсутствует привязка к новому пользователю (user_id = null).

Новый юзер

Новая запись контактов

Как сделать так, чтобы новой записи контактов присваивалась новая запись пользователя автоматом?

@Entity()
@TableInheritance({ column: { type: 'varchar', name: 'type' } })
export abstract class User extends Member {
  @OneToMany('Contact', (contact: Contact) => contact.getUser, {
    cascade: true,
  })
  public contacts: Contact[];
}


@Entity()
export class Contact {
  @ManyToOne(() => User, (user) => user.contacts)
  @JoinColumn({ name: 'user_id' })
  public user: User;
}


export class CreateUserDTO implements Pick<User, 'contacts' | 'password'> {
  contacts: Contact[];
  password: string;
}


public async createEmployee(dto: CreateUserDTO): Promise<Employee> {
  const newEmployee = await this.employeeRepository.create(dto);
  const defaultRole = await this.roleService.getRoleByName(
    RoleEnum.USER,
  );

  newEmployee.setRoles([defaultRole]);
  newEmployee.setLogin(
    newEmployee.getContacts.find((p) => p.getType === ContactTypeEnum.EMAIL)
      .getValue,
  );
  newEmployee.setMemberType(MemberType.EMPLOYEE);
  return this.employeeRepository.save(newEmployee);
}

UPD Геттеры в декораторах, оказывается, нельзя использовать

@Entity()
@TableInheritance({ column: { type: 'varchar', name: 'type' } })
export abstract class User extends Member {
  @OneToMany(() => Contact, (contact) => contact.user, {
    cascade: true,
  })
  public contacts: Contact[];

}

Ответы

▲ 0

Вот, фактически, ваша задача

const category1 = new Category()
category1.name = "ORMs"

const category2 = new Category()
category2.name = "Programming"

const question = new Question()
... 
question.categories = [category1, category2]
await dataSource.manager.save(question)

Если cascade установлен в true, то для сохранения всех указанных выше данных в БД, достаточно одного вызова save, иначе понадобилось бы вызывать save для каждой сущности. Вот и всё отличие

▲ 0

Проблема решена. Связи не устанавливались из-за использования геттера в декораторе @OneToMany.