javascript - 如何使用 MikroORM 插入对象图?

标签 javascript orm mikro-orm

我正在尝试同时创建和更新多个实体(模型)。我通过使用 insertGraph API 在反对 ORM 中做到了这一点,如果它没有 id,它实际上插入实体,如果它有 id,则更新。

MikroORM 中是否有类似的 API?

目前我正在这样做:

app.put('/articles', async (req, res) => {
  const save = req.body.articles.map(async (dto) => {
    const article = Object.assign(new Article(), dto)
    await req.em.persistAndFlush(article)
  })


  await Promise.all(save)
  res.send({ ok: true })
})

但它会生成多个事务,我想在单个事务中处理所有内容。

最佳答案

这里的问题是,当使用 persistAndFlush 方法时,您会立即通过等待 promise 将实体持久保存到数据库中。相反,您可以调用 em.persistLater(article) 将其标记为持久化。然后调用 em.flush(),这将在单个事务中提交对数据库的所有更改。

app.put('/articles', async (req, res) => {
  req.body.articles.forEach(dto => {
    const article = Object.assign(new Article(), dto)
    req.em.persistLater(article)
  })

  await req.em.flush() // save everything to database inside single transaction
  res.send({ ok: true })
})

您可以通过将所有实体准备到一个数组中来使其更简单,而 persistAndFlush 则改为:

app.put('/articles', async (req, res) => {
  const articles = req.body.articles.map(dto => Object.assign(new Article(), dto))
  await req.em.persistAndFlush(articles) // save everything to database inside single transaction
  res.send({ ok: true })
})

此外,您可以在实体上使用 IEntity.assign() 方法,而不是使用 Object.assign(),该方法还将负责从中创建引用普通标识符:

const article = new Article().assign(dto)

关于 IEntity.assign() 的更多信息可以在文档中找到:

https://b4nan.github.io/mikro-orm/entity-helper/

您还可以使用 EntityManager.create() 助手,它会为您构建实体 - 这样做的好处是它会自动处理 constructor parameters ,将它们传递给构造函数而不是直接分配它们。

const article = req.em.create(Article, dto)

关于javascript - 如何使用 MikroORM 插入对象图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55339019/

相关文章:

java - JPQL:查询多列时,什么样的对象包含结果列表?

java - 在 Hibernate 中声明 POJO 的最佳实践

php - Symfony 3.4 - EntityManager 已关闭

node.js - 为 Node.js 选择 ORM 有多难?或者 Node.js 缺乏成熟的 ORM

mikro-orm Cascade.REMOVE,仅适用于 RDBMS 吗?

javascript - 删除或重新定义 Angular 模块

javascript - 为什么 Firebug 说 $.cookie() 不是函数?

javascript - 如何在 Rails View 中使用 AJAX

javascript - html输入类型按钮在输入时提交

serialization - NestJS从snake_case到camelCase的序列化