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

标签 hibernate grails groovy

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

相关文章:

mysql - Hibernate 使用 mariaDB 在映射表中生成键

grails - 如何在实时/生产环境中监控和维护我的 grails 应用程序?

groovy - 如何让 IntelliJ IDEA 识别 GPars DSL?

gradle - 用Gradle将env变量的值写入 list 文件

groovy - Gradle:用项目属性替换标记

java - Spring liquibase自定义ImplicitNamingStrategy

java - 在 Hibernate 中将对象从查询转换为其他类?

java - 如何使用 Spring JPA 在同一事务中的不同数据库上维护多个 sql 查询

grails - GORM 抽象域类

tomcat - chalice 2.1.1。退出并出现错误 "bad"