域类:
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')
}
嗨,我在上面发布了所有必要的代码,这些代码可能会帮助你分析问题所在。基本上,错误为syncFlag
,dateLastModified
不能为空。所以我所做的是通过使用移除这些密钥
params.remove('<column name>')
因此,在hibernate的insert语句中,这些将被跳过,因为我在MySQL中定义了这些不应该为null,所以它将使用默认值集。问题是我一直得到同样的错误(…不能为null(。所以我所做的是在域类中设置这些值的默认值,但它也不起作用。我还试着这样硬编码:
params.syncFlag=false
但它也不起作用。
当打印这两个字段的值时,即使我已经硬编码了,我也会得到null。
我想我已经做了一切可以调试的事情,但都失败了。你能告诉我是什么原因造成的吗?为什么我不能为空?
您的域类被设置为不允许null属性。这是Grails的默认值。若要允许null,请使用可为null的约束。
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((过滤掉它们。请注意,我所说的过滤器是指原始参数保持不变。
您可能真的认为这很奇怪,但这解决了我的问题。
Employee employeeInstance = new Employee(params);
employeeInstance.setSyncFlag(false);
employeeInstance.setDateLastModified(new Date());
employeeInstance.save(flush:true)
问题是我很难更改params中的一些值,我不知道为什么。所以我所做的是,在调用save之前,我使用setter更改了值。这起到了作用。