TypeORM创建新记录时Repository的save()与insert()方法有什么区别
TypeORM 中
Repository 的 .save() 和 .insert() 方法区别 你疑惑的官方注释内容翻译如下:
和 save 方法不同,insert 执行的是底层原生操作,不会处理级联、关联关系及其他附加操作。
出自.insert()官方注释
两者的核心差异可以分为以下几点:
- 执行逻辑不同
insert仅执行纯 INSERT 插入操作,不会提前校验数据库中是否存在对应记录,如果插入数据的主键或唯一键重复,会直接抛出异常。save会先判断传入实体是否已存在(如果实体携带主键字段):不存在则执行插入,存在则执行更新,本质是 upsert 逻辑。
- 关联与级联处理不同
这也是上述注释的核心含义:insert是轻量化的底层操作,仅会插入当前实体对应表的字段,不会处理实体的关联关系,也不会触发你配置的级联规则。比如你有个关联了 Address 实体的 User 实体,传入带 Address 数据的 User 对象调用insert,只会插入 User 表数据,Address 表不会有任何变动。save会自动识别实体的关联配置,如果你开启了级联保存,传入带关联数据的实体时,会自动操作关联表、维护外键关联。
- 性能表现不同
insert没有多余的前置校验、关联处理逻辑,执行效率更高,更适合批量插入大量数据的场景。save额外的判断、关联处理逻辑会消耗更多性能,批量插入大量数据时性能远低于insert。
- 返回值不同
insert返回InsertResult类型对象,仅包含插入生成的主键值、影响行数等信息,不会返回完整的实体实例。save返回处理完成后的完整实体对象,包含数据库自动生成的主键、默认填充字段等所有数据。
内容的提问来源于stack exchange,提问作者Raz Luvaton
相关产品推荐
相关产品推荐

