Hibernate Grails-not null属性引用空值或瞬时值

Hibernate Grails-not null属性引用空值或瞬时值,hibernate,grails,groovy,Hibernate,Grails,Groovy,我有几个基本的grails域对象: 任务 使用者 最近,我希望能够将任务分配给多个用户。因此,我将以下代码添加到Task.groovy类中: static hasMany = [users: User] static mapping = { users joinTable: [name: 'task_user', column: 'user_id', key: 'task_id'] } 因此,现在可以使用联接表将任务分配给多个用户—联接任务和用户表。现在,当我创建一个新任务时,它会给

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

任务 使用者

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

static hasMany = [users: User]

static mapping = {
    users joinTable: [name: 'task_user', column: 'user_id', key: 'task_id']
}
因此,现在可以使用联接表将任务分配给多个用户—联接任务和用户表。现在,当我创建一个新任务时,它会给我错误消息:

“not null属性引用null或暂时值:blah.User.address”

在生成的联接表“task\u user”中,它只需要user对象中的user\u id,因此我不理解它为什么抱怨其他用户字段为null。用户对象将始终存在于数据库中。我不想为了创建新任务而必须完全加载每个用户。我很确定这与级联有关


我想要的行为是,如果任务被删除,那么Task_user join表中的关联条目应该被删除。我“从不”希望由于保存任务而更新/删除用户对象。我不知道如何继续。

您最近是否修改了用户表上的约束?我以前见过这些错误,通常是在模式生成后,我使属性不可为null时。。。我猜如果表中已经有一个空值用于修改为不可为空的属性,则架构更新会以静默方式失败,最终会出现类似这样的错误。

Fix

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

对您看到的错误的解释


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

是否可以发布一些生成错误的代码?这将有助于给出更好的答案。我的第一个想法是,你引用的用户对象不是用户的实例化版本(这意味着它只设置了一个id,在这种情况下,你会得到这样一个错误)还有一个问题,关于我在我的原始帖子中构建映射的方式,如果我有一个临时用户集合,其中唯一的非空字段是“id”,然后按照我在上一条评论中所述加载用户,最后保存任务:myTask.SAVE(failOnError:true);我是否会因为级联而面临任何用户被自动更新的危险?或者,只有在用户对象中添加“属于”时,才会这样做?级联规则有点复杂。谢谢。关于第一个问题,你从哪里得到这个任务。如果它是一个表单输入——我认为有一种方法可以让grails自动完成——将表单中的id绑定到User.load。否则,最好将其作为单独的用户ID集合,而不是将其设置为Task.users。关于第二个问题-否-如果加载对象,则不可能自动更新-更新对象的唯一情况是设置一个属性-在这种情况下,将首先从db初始化对象。