为具有关系的对象实现save()动作?

时间:2015-07-03 13:12:31

标签: java grails groovy gorm

我有以下Grails GORM域类:

  @Transactional
  def save(Item item) { 

   ...

   if (item.hasErrors()) {
   ...
   }

   category.addToItems(item)
   if (!category.save(flush: true)) { ... }

  }

在我的ItemController中,我有一个项目的create()和save()动作。

save()动作如下所示:

item.hasErrors()

问题是 category.addToItems(item) if (!category.save(flush: true)) { ... } if (item.hasErrors()) { ... } 将报告错误,因为`item.category``为空。它尚未与该类别相关联。

如果我切换像:

这样的块
/g

然后我在保存之前无法检查项目错误。

处理此问题的最佳方法是什么?

3 个答案:

答案 0 :(得分:0)

你试过吗

category.addToItems(item)
if (item.hasErrors()) {
 ...
}
if (!category.save(flush: true)) { ... }

编辑:

在我的grails项目中,我手动处理集合。这意味着在这个例子中我添加了Category:

static mapping = {
    items cascade: 'none'
}

然后在保存对象时,我先保存类别,然后保存所属项目。像:

category.addToItems(items)
if (!category.save(flush:true)) { ... } // will not save items
if (!item.save(flush:true)) { ... }

如果您不想在项目出错时保存类别,请确保您在交易中并使用

item.save(failOnError:true)

答案 1 :(得分:0)

category.addToItems(item) if (!category.save(flush: true)) { ... } 不要在Item控制器中处理此问题。首先创建项目(无关系),然后创建类别。使用

Category.addToItems(item).save(failOnError:true)

为什么不在此阶段将它留给脚手架为您生成代码?它管理关系,您可以清楚地了解正在发生的事情,然后根据您的需求量身定制?

答案 2 :(得分:0)

您可以致电obj.validate( [ 'someProp', 'someOtherProp' ] )仅验证所需的媒体资源。

有关详细信息,请参阅ref-doc