使用大量变量更新域类对象的最佳方法是什么

时间:2016-02-05 07:05:44

标签: grails groovy constructor

假设我有Employee域类,我想从UI端的params map创建域类的对象。

我可以通过以下两种方式创建对象

  1. 正常方式
  2.   

    员工雇员=新员工(姓名:params.name,rollNo:   params.rollNo)

    等等。如果domain类有20个变量,那么我们需要在上面的构造函数中编写所有变量。

    1. 以下是创建对象的最佳方式
    2.   

      员工员工=新员工(参数)

      上面的构造函数将使用匹配的参数填充对象。右。

      现在我的问题来了。

      如果假设我从DB获取了现有的域类对象,现在我想从来自UI的params map更新此对象。 什么是最好的方法(就像我们在上面的第二个选项中所做的那样)。

2 个答案:

答案 0 :(得分:0)

我认为最好使用命令对象并将其绑定到Employee。

这里是示例伪代码:

class EmployeeMgmtController {
    def editEmp(EmployeeCmd cmd){
        Employee editEmp = Employee.get(1)
        editEmp.properties = cmd
        editEmp.save()
    }
}

class EmployeeCmd{
    String id

    static constraints = {
        id blank:false,nullable:false
    }
}

,或者

你是否是你的控制器,并且仍然想要使用params(并排除你不想要绑定的任何字段):

bindData(editEmp, params, [exclude:['firstName', 'lastName']])

答案 1 :(得分:0)

如果要在服务类中实现此目标,请使服务实现grails.web.databinding.DataBinder,然后使用bindData方法,如下所示。

import grails.web.databinding.DataBinder

class MyAwesomeService implements DataBinder {

    /**
    * Updates the given instance of a domain class to have attribute values specified
    * in "newData" map.
    */
    MyDomain updateMyDomainAttributes(MyDomain myDomianInstance, Map newData) {
        bindData(myDomianInstance, newData)
        myDomianInstance.save(flush: true)
    }
}