gpt4 book ai didi

hibernate - Grails - 非空属性引用空值或 transient 值

转载 作者:行者123 更新时间:2023-12-02 15:13:59 27 4
gpt4 key购买 nike

我有一些基本的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com