【问题标题】:Nestjs one to many relationship save issueNestjs一对多关系保存问题
【发布时间】:2021-01-01 22:08:03
【问题描述】:

我有一项服务,我试图用关系实体(一对多)保存一个实体。我所拥有的是:

支付实体:

@Entity('payment')
export class PaymentEntity {

 @PrimaryColumn()
 id: number;

 @OneToMany(type => PaymentExamEntity, paymentExam => paymentExam.payment,  { cascade: true })
 paymentExams: PaymentExamEntity[];

  ... 
}

PaymentExamEntity:

@Entity('payment_exam')
export class PaymentExamEntity {
  
  @PrimaryColumn()
  id: number;

  @ManyToOne(type => PaymentEntity, payment => payment.paymentExams)
  @JoinColumn({name: 'payment_id'})
  payment: PaymentEntity;

  ....
}

支付服务:

@Injectable()
export class PaymentService {
    constructor(@InjectRepository(PaymentEntity) private paymentRepo: Repository<PaymentDTO>,
                @InjectRepository(PaymentExamEntity) private paymentExamRepo: Repository<PaymentExamDTO>) {  }

    async create(data: PaymentDTO) {  
        const payment = this.paymentRepo.create(data);
        await this.paymentRepo.save(payment);

        for(let item of data.paymentExams){
            item.payment = payment;

            const paymentExams = this.paymentExamRepo.create(data.paymentExams);
            this.paymentExamRepo.save(data.paymentExams);
        }
        
        return payment;
    }

我可以看到支付实体已保存,但由于缺少外键值,paymentExams 实体未能保存。

[Nest] 11545   - 01/01/2021, 12:15:52 AM   [ExceptionsHandler] ER_NO_DEFAULT_FOR_FIELD: Field 'payment_id' doesn't have a default value

问题是付款对象在保存后没有从数据库自动生成的id更新。因此外键的分配为空。有没有其他解决方案。如何存储子实体?

提前致谢

【问题讨论】:

    标签: nestjs typeorm


    【解决方案1】:

    save 方法返回一个带有 id 字段的Payment 类型的对象。您可以将其存储在一个变量中,并在item.payment 赋值中使用它。

    【讨论】:

    • 我试过了,但支付对象仍然不包含存储在数据库中的 id 值
    【解决方案2】:

    好的,我设法使它与以下更改一起工作:

    1. Payment entity changed id field annotation from  @PrimaryColumn() to  @PrimaryGeneratedColumn()
    2. PaymentExam entity changed id field annotation from  @PrimaryColumn() to  @PrimaryGeneratedColumn()
    

    在支付服务中我只能有这个:

     async create(data: PaymentDTO) {  
            const payment = this.paymentRepo.create(data);
            await this.paymentRepo.save(data);
            return payment;
    }
    

    我还使用 mysql 数据库为这 2 个表中的主键自动递增

    【讨论】:

      猜你喜欢
      • 2021-08-09
      • 1970-01-01
      • 2011-07-12
      • 2011-01-21
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 2020-08-29
      相关资源
      最近更新 更多