创建后获取域对象的id

时间:2016-08-29 20:56:30

标签: grails gorm

我正在结账,当用户去购买时,会创建一个Purchase对象并保存到数据库中。然后我拿走对象的id并将其发送到PayPal以生成一个按钮(这样我可以在以后识别购买)。但是,当我尝试检索id时,它返回null。

我在访问id之前尝试刷新它,但它似乎仍然无效。

这是我的域名对象:

package website

import java.time.Instant
import java.time.temporal.ChronoUnit

class Purchase {
    String buttonId
    final Instant expires
    private boolean complete

    User user
    Product product

    Purchase(Product product, User user) {
        this.product = product
        this.user = user

        expires = Instant.now().plus(1, ChronoUnit.DAYS)
    }

    void completePurchase() {
        // confirm that the purchase hasn't been completed already
        if (complete) {
            throw new PurchaseAlreadyCompleteException()
        }

        complete = true
    }

    boolean isComplete() {
        return complete
    }

    static class ButtonIdAlreadyInitializedException extends RuntimeException {}

    static class PurchaseAlreadyCompleteException extends RuntimeException {}
}

以下是我正在运行的代码:

Purchase purchase = new Purchase(product, user)
purchase.save(flush: true)
println 'purchase id: ' + purchase.id

2 个答案:

答案 0 :(得分:4)

ID为null,因为您的对象未被保存。它未被保存的原因是您没有为WebAPI分配值,并且此属性是必需的。您可以通过以下方式验证:

buttonId

答案 1 :(得分:1)

您需要捕获purchase.save()方法的结果。它返回更新的域对象,其中包含已解析的id。因此,您的代码应如下所示:

Purchase purchase = new Purchase(product, user)
purchase = purchase.save(flush: true)
if (!purchase || purchase.hasErrors()) {
    log.error("Failed to commit purchase - probable validation errors')
}
println 'purchase id: ' + purchase.id

请注意,如果在save方法中设置failOnError:true标志,那么如果存在阻止保存方法的验证或hibernate / SQL错误,则会抛出异常。我觉得我比上面提供的软检查更喜欢异常处理。

此外,由于您的域定义中没有约束块,因此所有字段都可以为空:默认为false,因此您必须为buttonId提供值,否则域将无法验证并且purchase.save()方法调用会失败。