У меня есть следующая сущность в TypeORM:
@Entity('category')
export class Category {
@Column({ length: 80 })
public name: string;
@OneToOne(
(): ObjectType<Category> => Category,
(category: Category): Category => category.parent,
{
cascade: ['insert', 'update'],
}
)
@JoinColumn({ name: 'parent', referencedColumnName: 'id' })
public parent: Category;
}
Затем я сохраняю несколько категорий в своей базе данных:
let parentCategory = new Category();
parentCategory.name = 'Parent Category';
let childCategory = new Category();
childCategory.name = 'Child Category';
childCategory.parent = parentCategory;
connection.manager.save(childCategory);
Наконец, я хочу добавить новую дочернюю категорию «Родительская категория» (учитывайте, что родительская категория была загружена из базы данных и содержит ее идентификатор):
let newChildCategory = new Category();
newChildCategory.name = 'New Child Category';
newChildCategory.parent = childCategory.parent; //<- childCategory.parent contains the parent ID
connection.manager.save(newChildCategory); //<- Throws duplicate key error due to cascade
Одно жизнеспособное решение - определение поведения ON DUPLICATE KEY
, которое должно быть реализовано вручную в соответствии с эта информация . Есть ли другое решение, позволяющее сделать это при сохранении объекта без необходимости писать весь запрос, как в моем примере?
Этот репозиторий GitHub содержит приложение, воспроизводящее проблему.