postgresql - TypeOrm 不会在更新时保存实体及其关系
问题描述
给定以下关系:
@Entity({name: 'accounts'})
export class Account {
@PrimaryGeneratedColumn('uuid')
id: string;
@OneToOne(type => Address, address => address.id)
@JoinColumn({name: 'address_id'})
address: Address;
@Column()
name: string;
}
和地址关系:
@Entity({name: 'addresses'})
export class Address {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column({length: 45})
country: string;
}
当我account
通过这个获得实体时:
/**
* Gets account by haccount ID with ALL relations
* @param accountId The account ID
*/
public async getAccountByAccountIdWithRelations(accountId: string): Promise<Account> {
return await this.findOneOrFail({id: accountId}, {relations: ['address']});
}
我得到了包含关系的完整Account
实体。Address
然后当我执行以下操作时:
account.address.country = 'newcountry';
并且地址this.save(account)
中accountRepository
的do根本不会更新!
当我在保存之前进行控制台日志时,我看到了account
具有更新地址的实体,所以这真的很奇怪!
为什么会这样?
注意:所有查询都在一个事务中完成;我不知道这是否重要
解决方案
应设置级联。这是我的实体的示例:
@Entity()
@Index([ 'studyId', 'teamId', 'enterdate' ])
export class DataMessage extends BaseEntity {
@PrimaryGeneratedColumn('increment') id: number;
@CreateDateColumn() enterdate: Date;
@UpdateDateColumn({ select: false })
updatedAt?: Date;
@Column() owner: string;
@Column() studyId: number;
@Column() teamId: number;
@Column() patient: string;
@Column() orderId: number;
@Column({ default: DataMessageStatus.OPEN })
status: DataMessageStatus;
@Column()
@Index()
resultId: number;
@OneToMany(() => DataMessageContent, (c) => c.message, { cascade: true })
contents: DataMessageContent[];
}
@Entity()
export class DataMessageContent extends BaseEntity {
@PrimaryGeneratedColumn('increment') id: number;
@CreateDateColumn() enterdate: Date;
@Column() owner: string;
@Column() role: UserRole;
@Column({ default: MessageStatus.UNREAD })
status: MessageStatus;
@Column() txt: string;
@ManyToOne(() => DataMessage, (m) => m.contents)
message: DataMessage;
}
这也应该适用于 onetoone 关系。
推荐阅读
- r - 如何使用令牌在 R 中调用 API
- java - java如何编组/解组复杂的xml对象
- node.js - 解决调用 FirestoreAdminClient.exportDocuments 时的“7 PERMISSION_DENIED:调用者没有权限”
- sql - 如何在 HANA SQL 中编写 CASE WHEN COUNT
- youtube-api - 如何将 YouTube 卡添加到播放列表中的所有视频?
- qt - 如何在没有副本的情况下为已经存在的树状数据结构实现 QAbstractItemModel?
- node.js - NodeJS:公牛工作有时会开始,有时不会
- python - Pandas DataFrame - 在两个字符串之间提取字符串并包含第一个分隔符
- xamarin - 在自定义内容页面上添加内容
- blazor-server-side - Blazor Serverside 单例服务,加载同一页面时,一个浏览器中的更改会反映在另一个浏览器中