typeorm之Entity Listeners
发布日期:2021-05-28 16:24:05 浏览次数:39 分类:精选文章

本文共 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 监听器。
  • 查找操作(find):查找实体时会触发 AfterLoad 监听器。
  • TypeORM的监听器机制对于管理实体的生命周期事件非常有用,可以帮助开发者在不同的操作阶段执行自定义逻辑。通过合理配置监否器,可以实现实时logging、数据变更通知、业务逻辑扩展等多种功能。

    上一篇:typeorm之subscriber
    下一篇:express内部Layer结构

    发表评论

    最新留言

    路过按个爪印,很不错,赞一个!
    [***.219.124.196]2025年04月27日 05时50分10秒