Grails框架方法addTo在多次调用时抛出异常

时间:2011-07-21 12:47:17

标签: java database grails groovy

我想添加对User类的订阅,我是通过调用“addTo”方法来实现的,这是我的代码:

if (params.jobs == "on") {
        user.addToSubscriptions(Category.findWhere(id: 1L))
    } else {
        user.removeFromSubscriptions(Category.findWhere(id: 1L))
    }

“params”来自复选框,用户可以通过设置复选框来订阅类别。提交表单时会调用上面的代码。什么不起作用的是当用户更改超过1个类别时,请使用不同的params.x来考虑与上面相同的代码,如下所示

    if (params.offers == "on") {
        Category cat = Category.get(2)
        if (!user.subscriptions.contains(cat))
        user.addToSubscriptions(Category.findWhere(id: 2L))//needs long variable
    } else {
        user.removeFromSubscriptions(Category.findWhere(id: 2L))
    }

只有代码中的第一个类别被添加和删除,所有其他类别抛出以下异常:

org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update

编辑: 抛出异常的那一行就是这一点,对我来说毫无意义:(

编辑: 当我想添加一个类别时,会抛出异常,已经添加了它,它也没有被删除。 (这仅适用于代码中未首先处理的类别,不要问我原因)

     //reload page
    redirect(action: "userSettings")

我该怎么办?请帮忙! 非常感谢!丹尼尔

1 个答案:

答案 0 :(得分:2)

您是否可能尝试删除与用户无关的类别? 就像你知道的......用户没有id = 2的类别,他发送了params.offers ==“off”?

也许你应该这样做:

if (params.jobs == "on") {
    user.addToSubscriptions(Category.findWhere(id: 1L))
} else {
    Category cat = Category.get(2L)
    if (user.subscriptions.contains(cat)) {
        user.removeFromSubscriptions(cat)
    }
}

几点提示: 如果您有id,请不要使用:

Category.findWhere(id:1L) 

但:

Category.get(1L)

在您粘贴的行上抛出错误,因为它可能是您控制器的最后一行,因此在此行之后您将提交错误的事务处理。

尝试将此代码添加到您的控制器:

user.save()
user.errors?.allErrors?.each { println it }

这将打印保存期间发生的所有错误。