Я не уверен, является ли это ошибкой, или я делаю что-то не так, но я пытался многое сделать, чтобы это работало, и я не мог. Я надеюсь, что вы, ребята, можете помочь.
В основном у меня есть отношения один к одному, которые мне нужны для lazyLoad. Дерево отношений в моем проекте довольно большое, и я не могу загрузить его без обещаний.
Проблема, с которой я сталкиваюсь, заключается в том, что при сохранении дочернего элемента в созданном родительском обновлении sql отсутствуют поля обновления: UPDATE `a` SET WHERE `id` = 1
Это отлично работает, когда я не использую lazyLoading (Promises).
Я получил простой пример с использованием инструмента сгенерированного кода.
Сущность A
@Entity()
export class A {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToOne(
(type: any) => B,
async (o: B) => await o.a
)
@JoinColumn()
public b: Promise<B>;
}
Сущность B
@Entity()
export class B {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToOne(
(type: any) => A,
async (o: A) => await o.b)
a: Promise<A>;
}
main.ts
createConnection().then(async connection => {
const aRepo = getRepository(A);
const bRepo = getRepository(B);
console.log("Inserting a new user into the database...");
const a = new A();
a.name = "something";
const aCreated = aRepo.create(a);
await aRepo.save(aCreated);
const as = await aRepo.find();
console.log("Loaded A: ", as);
const b = new B();
b.name = "something";
const bCreated = bRepo.create(b);
bCreated.a = Promise.resolve(as[0]);
await bRepo.save(bCreated);
const as2 = await aRepo.find();
console.log("Loaded A: ", as2);
}).catch(error => console.log(error));
выход
Inserting a new user into the database...
query: SELECT `b`.`id` AS `b_id`, `b`.`name` AS `b_name` FROM `b` `b` INNER JOIN `a` `A` ON `A`.`bId` = `b`.`id` WHERE `A`.`id` IN (?) -- PARAMETERS: [[null]]
query: START TRANSACTION
query: INSERT INTO `a`(`id`, `name`, `bId`) VALUES (DEFAULT, ?, DEFAULT) -- PARAMETERS: ["something"]
query: UPDATE `a` SET WHERE `id` = ? -- PARAMETERS: [1]
query failed: UPDATE `a` SET WHERE `id` = ? -- PARAMETERS: [1]
Если я удаляю обещания из сущностей, все работает нормально:
Сущность A
...
@OneToOne(
(type: any) => B,
(o: B) => o.a
)
@JoinColumn()
public b: B;
}
Сущность B
...
@OneToOne(
(type: any) => A,
(o: A) => o.b)
a: A;
}
main.ts
createConnection().then(async connection => {
...
const bCreated = bRepo.create(b);
bCreated.a = as[0];
await bRepo.save(bCreated);
...
выход
query: INSERT INTO `b`(`id`, `name`) VALUES (DEFAULT, ?) -- PARAMETERS: ["something"]
query: UPDATE `a` SET `bId` = ? WHERE `id` = ? -- PARAMETERS: [1,1]
query: COMMIT
query: SELECT `A`.`id` AS `A_id`, `A`.`name` AS `A_name`, `A`.`bId` AS `A_bId` FROM `a` `A`
Я также создал проект git, чтобы проиллюстрировать это и облегчить тестирование.
1) с использованием обещаний (не работает) https://github.com/cuzzea/bug-typeorm/tree/promise-issue
2) не ленивая загрузка (рабочая) https://github.com/cuzzea/bug-typeorm/tree/no-promise-no-issue