Grails:无法设置参数值并保持不变为

时间:2015-08-19 10:40:01

标签: hibernate grails

域类:

class Employee {
    .
    .
    Boolean syncFlag
    Date dateLastModified 
}

MySQL的:

Column name              Data type                    Default value
---------------------------------------------------------------------                                                                                                                 
sync_flag                BIT(1)         Not Null      b'0'                                                                                                                                                                                                                                                                                                    

date_last_modified       TIMESTAMP      Not Null      CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

控制器:

def save() {      
       .
       .

    params.remove('id')

     if(params.dateLastModified){
        params.remove('dateLastModified')
     }

     if(params.syncFlag){
        params.remove('syncFlag')
     }

您好,我已经发布了所有必要的代码,可以帮助您分析问题所在。基本上,错误为syncFlagdateLastModified不能为空。所以我所做的就是使用

删除这些键
params.remove('<column name>')

因此,在hibernate的insert语句中,这些将被跳过,因为我在MySQL中定义这些不应该为null,它将使用默认值集。问题是我一直得到同样的错误(....不能为空)。所以我所做的是在域类中设置这些的默认值,但它也不起作用。我也试着像这样硬编码:

params.syncFlag=false

但它也没有用。

当打印这两个字段的值时,即使我已经对它进行了硬编码,我也会为空。

我想我已经做了所有我可以调试的但是所有这些都失败了。你能告诉我是什么原因造成的吗?为什么我得到的不能为空?

2 个答案:

答案 0 :(得分:1)

您的域类设置为不允许null属性。那是Grails的默认值。要允许空值,请使用nullable constraint

class Employee {
    ...
    static constraints = {
        dateLastModified nullable: true
        syncFlag nullable: true
    }
}

提示

要获取没有某些键的地图,您可以按照以下示例:

def params = [
    id: 100,
    dateLastModified: new Date(),
    syncFlag: true,
    other: "This won't get filtered out"]

def ignore = ['id', 'dateLastModified', 'syncFlag']
assert params.findAll { key, value -> !(key in ignore) } == [other:"This won't get filtered out"]

您可以使用 findAll()过滤掉它们。请注意,通过过滤器,我的意思是原始参数保持不变。

答案 1 :(得分:0)

你可能会认为这很奇怪,但这解决了我的问题。

Employee employeeInstance = new Employee(params);
employeeInstance.setSyncFlag(false);
employeeInstance.setDateLastModified(new Date());
employeeInstance.save(flush:true)

问题是我很难改变params的一些价值,我不知道为什么。所以我做的是,在我调用save之前,我使用setter更改了值。这很有效。