【发布时间】:2012-04-24 20:52:37
【问题描述】:
我遇到了一些乍一看似乎是 Gorm 中的错误(grails 1.3.7)。我想我会在处理 jira 问题之前在这里发布问题,以防我弄错了。
问题来了:
我有一个域类,它引用同一个类的父对象,也可以有一个指向别名的指针,也属于同一个域类。
这是域类:
class Mydomain {
String name
Mydomain alias
Mydomain parent
Mydomain foo
static constraints = {
parent(nullable: true)
alias(nullable: true)
foo(nullable: true)
}
}
如果我执行以下脚本:
Mydomain.list()*.delete()
def one=new Mydomain(name:'one').save()
new Mydomain(name:'two', parent:one).save()
Mydomain.list().each{
println it.name
println "parent:${it.parent?.name}"
println "alias:${it.alias?.name}"
println "foo:${it.foo?.name}"
println "============================"
}
我得到以下结果:
one
parent:null
alias:two
foo:null
============================
two
parent:one
alias:null
foo:null
============================
这意味着当我设置 two.parent=one 时,gorm 会继续设置 one.alias=two。
我猜gorm这样做是因为它推断出one和two之间存在双向关系,然后设置对象一个对两个的引用。
我可以看到这种行为适用于 Author 和 Book 之间的双向关系(假设作者当然只写一本书),但在我的情况下这是危险的,因为 gorm 会覆盖一个没有任何关系的关系这样做。
所以我的问题是,我如何告诉 GORM 将其视为单向可为空的关系?
感谢您的任何想法
更新:商业案例
这是我尝试建模的业务案例。 公司有名称,可以有子公司、仓库、当地办事处等。这是在父关系的帮助下建模的,有效地创建了公司树:
class Company {
String name
Company parent
}
现在,这种组织结构的表示对每个人来说都不一样,有些人可能不在乎办公室级别,或者在乎小组级别。这就是为什么公司可以在并行表示中使用别名。它仍然是同一家公司,可以有不同的名称,但您希望能够通过别名关系在这些平行树组织之间导航。
class Company {
String name
Company parent
Company alias
}
所以是的,与 self 有多种关系,但它们具有非常不同的含义,我知道 GORM 使用最常见的简单情况作为默认值,但我真的在 DSL 中尽我所能来指示 GORM做正确的事,但没有成功。
执行此操作的常规方法是使用 mappedBy 指令添加双向一对多关系:
class Company {
String name
Company alias
static belongsTo=[parent:Company]
static hasMany=[children:Company]
static mappedBy=[children:'parent']
}
但在许多 GORM 文章中,由于严重的性能问题,不鼓励使用这种成语。这就是为什么我想要一个单向关系
Company ---(parent)---> Company
【问题讨论】:
-
您在这里创建了 3 个自我关系。这就是 GORM 的看法。
-
我已经解释了商业案例
标签: grails grails-orm