【问题标题】:Why entity id is incremented after merging? [Grails]为什么实体ID在合并后递增? [圣杯]
【发布时间】:2012-05-29 16:52:51
【问题描述】:

我想创建一个用于更新实体的通用代码。这是我想出的:

def update(id, Object updatedEntity) {
    def entity = findById(id)
    if (entity) {
        updatedEntity.id = id
        def mergedEntity = updatedEntity.merge()
        if (mergedEntity) {
            return mergedEntity
        } else {
            throw new ValidationException("Cannot update.", mergedEntity.errors)
        }
    } else {
        throw new IllegalArgumentException("No ${domainClass.getSimpleName()} with id=${id} found.")
    }
}

为什么mergedEntity 总是增加id 值(我的意思是如果updatedEntity.id = 1,那么mergedEntity.id 将是2。我该如何解决?

【问题讨论】:

  • updatedEntity 是一个分离的实体吗?我认为您需要阅读合并实际用于什么。 grails.org/doc/latest/ref/Domain%20Classes/merge.html
  • Grails 是一种动态语言,并且已经有很多内置的“通用代码”来处理这样的事情。你能解释一下你想做什么以及为什么?
  • @Gregg:是的,updatedEntity 已分离。
  • @MichaelJ.Lee:我有很多实体类型。对于所有这些,我需要具有基本 CRUD 和更多内容的服务类。我想将尽可能多的通用逻辑移至父服务类(GenericService)。子类只会从参数创建一个实体,并将其传递给对应的父方法。让我们考虑UserService#update()。它的代码应该是这样的:def updatedUser = new User(name: params.newName, age: params.newAge); super.update(params.id, updatedUser).

标签: grails groovy grails-orm


【解决方案1】:

我找到了导致所描述行为的原因:我的 id 参数始终是 String 的实例,因此当我传递 id = 1 时,实际 id 值为“1”,它不被视为休眠 @987654322 @。

除此之外,为了完成这项工作,我还必须覆盖 version 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多