Как удалить объекты из коллекции «один ко многим» только с составными первичными ключами в MariaDB - PullRequest
0 голосов
/ 14 апреля 2020
@Entity()
export class Job {

  @PrimaryKey({ type: BigIntType })
  id: string;

  @OneToMany(() => JobExperienceLevel, 
   jobExperienceLevel => jobExperienceLevel.job, {cascade: Cascade.ALL], orphanRemoval: true})
  experienceLevels = new Collection<JobExperienceLevel>(this);

}


@Entity()
export class JobExperienceLevel {

  @PrimaryKey()
  @Enum({
    items: () => JobExperienceLevelType
  })
  experienceLevel: JobExperienceLevelType;

  @ManyToOne({nullable:false, primary: true, joinColumn: 'job_id'})
  job: Job;
}

export enum JobExperienceLevelType {
  ENTRY_LEVEL = 'ENTRY_LEVEL',
  JUNIOR = 'JUNIOR',
  REGULAR = 'REGULAR',
  SENIOR = 'SENIOR'
}

После вызова experienceLevels.removeAll () для некоторой сущности задания генерируется следующий запрос:

 delete from `job_experience_level` where `experience_level` = 'SENIOR' and `job_id` is null

Таблица базы данных 'job_experience_level' содержит только составные первичные ключи (experience_level, job_id)

Я проверил, что перед вызовом метода removeAll в коллекции есть одна сущность 'SENIOR'.

Я использую репозиторий entity с репозиторием persistAndFlu sh для сущности задания.

Проблема в том, что этот запрос неправильный, и он должен заполнить правильный job_id.

Я также пытался удалить @PrimaryKey () из свойства experienceLevel, но тогда в транзакции вообще не было запроса на удаление.

1 Ответ

0 голосов
/ 16 апреля 2020

Как обсуждалось в комментариях, была ошибка с удалением сирот и составными ключами. Обновление до v3.6.7, чтобы исправить это.

https://github.com/mikro-orm/mikro-orm/blob/master/CHANGELOG.md#367 -2020-04-16

Вот тестовый пример, чтобы убедиться, что он действительно работает:

https://github.com/mikro-orm/mikro-orm/commit/94c71c89a648e03fad38a93cced7fa92bbfd7ff7#diff -595473b980e4d4384f667f60dbddde2aR1

...