gpt4 book ai didi

Grails 3 hasOne 可空性问题

转载 作者:行者123 更新时间:2023-12-02 15:50:46 25 4
gpt4 key购买 nike

在将现有应用程序从 Grails 2.5 迁移到 3.1 时,我遇到了双向一对一关系的奇怪问题。

想象一个带有 User 和 Employee 的简单模型对象。 A User代表通用用户帐户。并非所有用户都是员工,但所有员工都是用户。此外,员工可以引用经理、主管等(还有用户实例)。用户是关系的拥有方。

class User {
Employee employee

static mappedBy = [employee: "user"]
static hasOne = [employee: Employee]

static constraints = {
employee(nullable:true)
}
}

class Employee {
User user // represents employee's own account, a bi-directional one-to-one
User supervisor // represents a supervisor

static belongsTo = [user: User]

static constraints = {
user(unique:true)
supervisor(nullable:true)
}
}

升级到 Grails 3 后的问题是,在创建模式下,这会导致 supervisor_id员工表的列被生成为 NOT NULL ,而在 Grails 2 中,它按预期可以为空(只有 user_id 不是 NULL)。

我用 Grails 3.1.12 和 3.2.0 对此进行了测试,两者都获得了相同的行为。我在域类声明中做了什么愚蠢的事情吗?我尝试了多种映射来实现与 Grails 2.5 中相同的行为,但没有运气。在某些情况下,我什至在关系的双方都得到了一个外键......

最佳答案

我不知道为什么您的代码可以与以前版本的 Grails 一起使用,但这是错误的。

当您使用 hasManybelongsTo ,不需要在子对象中定义其他属性,也不需要使用mappedBy父级的属性(property),与父级相同(属性(property)雇员在 User)

Grails 不需要任何其他信息即可知道两个类的双向属性以及约束 user(unique : true)两者都不。

所以你的类应该是这样的:

class User {

static hasOne = [employee: Employee]

static constraints = {
employee(nullable: true)
}
}

class Employee {
User supervisor // represents a supervisor
static belongsTo = [user: User]

static constraints = {
supervisor(nullable:true)
}
}

很高兴知道您的数据库结构如何。但是通过这种方式,所有外键都存储在员工表中。但当然,您可以从两个实体进行导航。如果你有不同的结构,你可以用这个模型映射你当前的数据库。见 this
employee.user
user.employee

关于Grails 3 hasOne 可空性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39837621/

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