
本文共 2603 字,大约阅读时间需要 8 分钟。
TypeORM中的实体监听器是一种强大的工具,可以帮助开发者在特定操作时执行自定义逻辑。TypeORM提供了七个实体监听器,分别对应于不同的操作阶段:AfterLoad、BeforeInsert、AfterInsert、BeforeUpdate、AfterUpdate、BeforeRemove 和 AfterRemove。以下将详细解析这些监听器的用法和行为。
监听器的触发条件
TypeORM的监听器不会对每一个数据库操作都生效。它们只会根据特定的操作方法被触发。以下是需要明确的操作类型和对应的触发条件:
插入(Insert)方法:当使用
save()
、insert()
或create()
方法插入新实体时,BeforeInsert 和 AfterInsert监听器会被触发。更新(Update)方法:当使用
save()
、update()
、updateById()
方法对实体进行更新时,BeforeUpdate 和 AfterUpdate监听器会被触发。删除(Delete)方法:当使用
remove()
、delete()
、deleteById()
或removeById()
方法删除实体时,BeforeRemove 和 AfterRemove监听器会被触发。
需要注意的是,save()
方法在插入和更新时都可以触发对应的监听器。例如,调用 save()
对插入新实体和更新已有实体都会触发 BeforeInsert 和 AfterUpdate 等监听器。
另外,查找操作(如 find()
、findByIds()
、findOne()
和 findOneById()
)也会触发 AfterLoad监听器。这是因为在查找实体并加载它们到区域中时,TypeORM会触发 AfterLoad 事件。
了解这些触发条件非常重要,因为只有理解了它们才能正确地在实体中使用监听器。
实体类的示例
以下是一个使用TypeORM实体监听器的简单示例类:
import { Entity, Column, PrimaryColumn, AfterLoad, BeforeInsert, AfterInsert, BeforeUpdate, AfterUpdate, BeforeRemove, AfterRemove } from 'typeorm';@Entity({ name: 'bucket' })export class Bucket { @PrimaryColumn({ name: 'id', type: 'int' }) id: number; @Column({ name: 'age', type: 'int' }) age: number; @AfterLoad() al() { console.log('加载之后'); } @BeforeInsert() bi() { console.log('插入之前'); } @AfterInsert() ai() { console.log('插入之后'); } @BeforeUpdate() bu() { console.log('更新之前'); } @AfterUpdate() au() { console.log('更新之后'); } @BeforeRemove() br() { console.log('删除之前'); } @AfterRemove() ar() { console.log('删除之后'); }}
实际操作示例
使用TypeORM进行操作的示例代码如下:
import { createConnection, Repository, Connection } from 'typeorm';import { Bucket } from './Bucket';createConnection({ name: 'test', type: 'mysql', host: 'localhost', port: 3306, username: 'root', password: '123456', database: 'test', entities: [Bucket], synchronize: true, dropSchema: true}).then(async (connection: Connection) => { const repository = connection.getRepository(Bucket); const bucket: Bucket = repository.create({ id: 1, age: 222 }); // 插入操作 console.log('save插入'); await repository.save(bucket); console.log('save更新'); bucket.age = 1111; await repository.save(bucket); // 更新操作 console.log('remove'); await repository.remove(bucket);});
输出结果
执行以上代码后,会在控制台输出以下信息:
save插入插入之前插入之后save更新加载之后更新之前更新之后remove加载之后删除之前删除之后
总结
通过以上示例可以看到:
save()
方法触发 BeforeInsert 和 AfterInsert 监听器,同时插入实体到数据库中。save()
方法对已有实体进行更新时会触发 BeforeUpdate 和 AfterUpdate 监听器。remove()
方法删除实体时会触发 BeforeRemove 和 AfterRemove 监听器。TypeORM的监听器机制对于管理实体的生命周期事件非常有用,可以帮助开发者在不同的操作阶段执行自定义逻辑。通过合理配置监否器,可以实现实时logging、数据变更通知、业务逻辑扩展等多种功能。
发表评论
最新留言
关于作者
