我有一些基本的 grails 域对象:
任务
用户
最近,我希望能够将任务分配给多个用户。所以我将此代码添加到 Task.groovy 类中:
static hasMany = [users: User]
static mapping = {
users joinTable: [name: 'task_user', column: 'user_id', key: 'task_id']
}
因此,现在可以使用连接表将任务分配给多个用户 - 连接任务和用户表。现在,当我创建一个新任务时,它给了我错误消息:
“非空属性引用空值或 transient 值:blah.User.address”
在生成的连接表“task_user”中,它只需要来自用户对象的 user_id,所以我不明白为什么它提示其他用户字段为空。用户对象将始终存在于数据库中。我不想为了创建新任务而完全加载每个用户。我很确定它与级联有关。
我想要的行为是,如果删除了任务,则应删除 task_user 连接表中的关联条目。我“从不”希望用户对象因保存任务而被更新/删除。我不确定如何进行。
最佳答案
修复
您需要使用 User.load(id) 来获取对用户对象的引用。 load 不像 get 不会命中数据库——它只是创建一个代理,可以用来代替 User 对象。只要只访问 id 属性 - db 就不会被访问。
您看到的错误的解释
在您的代码中,您创建了一个未连接到 hibernate 的新用户对象( transient )。要将其连接到 hibernate 状态,您需要保存它或添加 belongs_to 属性 - 这两者都将尝试更新用户表中的行,并将每个字段设置为空。如果它是您正在创建的新用户对象并希望自动保存它,则需要设置 belongs_to(~ 级联)。
关于hibernate - Grails - 非空属性引用空值或 transient 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8041481/