使用bindData的Grails TransientObjectException

时间:2014-04-25 04:35:11

标签: exception grails data-binding

有一种我无法理解的行为。

我有2个域类,我使用这个名称来说明问题,Foo和Bar是:

[Foo]
class Foo {
 String value1
}

[Bar]
class Bar {
  String value1

  static belongsTo = [foo: Foo] 
}

现在我的控制器我有这个:

def createBar = {
   def foo = foo.get(params['foo_id'].toLong()) //this is a hidden field in form
   def bar = new Bar()
   bindData(bar, params, [exclude:['foo']])
   bindData(bar, foo, [include:['foo']] //This not work!

   //bar.foo = foo //This works fine! 
   bar.save()
}

当我使用bindData保存时,控制器抛出TransientObjectException,表示Foo未保存,但是当我使用第二个表单时,操作正常,并保存域而没有例外。

为什么会这样?我不明白,因为对我来说,bindValue()和bar.foo是相同的行为。

我没有在我的应用中使用dbCreate,只验证,这是表格的表示:

[Foo]
id (PK)
value1 (varchar)

[Bar]
id (PK)
value2 (varchar)
foo_id (FK)

我使用的是Grails 2.2.3

感谢。

1 个答案:

答案 0 :(得分:0)

您的代码存在各种问题。

您将foo的实例传递给排除,方法名称为bindData而不是bindValue

bindValue(bar, params, [exclude:[foo]])

这应该是

bindData(bar, params, [exclude:['foo']])