Grails - not-null属性引用null或transient值

时间:2011-11-07 19:27:43

标签: hibernate grails groovy

我有几个基本的grails域对象:

任务 用户

最近,我希望能够为多个用户分配任务。所以我将此代码添加到Task.groovy类:

static hasMany = [users: User]

static mapping = {
    users joinTable: [name: 'task_user', column: 'user_id', key: 'task_id']
}

因此,现在可以使用连接表将一个任务分配给多个用户 - 连接任务和用户表。现在,当我创建一个新任务时,它会给我错误消息:

“not-null属性引用null或transient值:blah.User.address”

在生成的连接表“task_user”中,它只需要User对象中的user_id,所以我不明白它为什么抱怨其他用户字段为空。用户对象将始终存在于数据库中。我不想完全加载每个用户以创建新的任务。我很确定它与级联有关。

我想要删除任务的行为,应该删除task_user连接表中的关联条目。我从不“希望”因保存任务而更新/删除用户对象。我不知道该怎么办。

2 个答案:

答案 0 :(得分:2)

<强>修正

您需要使用User.load(id)来获取对用户对象的引用。加载不像get没有命中数据库 - 它只是创建一个代理可以代替User对象的代理。只要访问id属性 - 不访问db。

您所看到错误的说明

在您的代码中,您创建了一个未与hibernate连接的新用户对象(transient)。要将它连接到hibernate,您需要保存它或添加belongs_to属性 - 这两个属性都会尝试更新用户表中的行,并将每个字段设置为null。如果它是您正在创建的新用户对象并希望将其自动保存,则需要设置belongs_to(〜to cascade)。

答案 1 :(得分:0)

您最近修改了User表上的约束吗?我之前看过那些错误,通常是在我已经生成了模式之后我做了一个不可为空的属性...我猜测表中是否已经存在一个空值,该属性被修改为不可为空的模式-update无声地失败,你最终会出现这样的错误。