一見、Gorm (grails 1.3.7) のバグのように見えるものに遭遇しました。間違っている場合に備えて、jiraの問題に進む前にここに問題を投稿すると思いました。
問題は次のとおりです。
私は 1 つのドメイン クラスを持っています。それは同じクラスの親オブジェクトを参照し、同じドメイン クラスのエイリアスへのポインタを持つこともできます。
これはドメイン クラスです。
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の間に双方向の関係があると推測し、オブジェクトoneのクラス Mydomain の最初のプロパティをtwoの参照に設定するためだと思います。
Author と Book の間の双方向の関係でこの種の動作が行われていることがわかります (もちろん、著者が 1 本の本しか書いていないと仮定します) が、私の場合、これは危険です。 .
私の質問は、GORM にこれを単方向の null 許容関係として扱うように指示するにはどうすればよいですか?
アイデアをありがとう
更新: ビジネス ケース
これは、私がモデル化しようとしているビジネス ケースです。会社には名前があり、子会社、倉庫、地方事務所などを持つことができます。これは、親関係の助けを借りてモデル化され、会社のツリーを効果的に作成します。
class Company {
String name
Company parent
}
さて、この組織構造の表現は誰にとっても同じではなく、オフィスレベルやグループレベルを気にしない人もいるかもしれません. これが、会社がパラレル表現で別名を持つことができる理由です。同じ会社であり、別の名前を持つこともできますが、エイリアス関係を介してこれらの並列ツリー組織間を移動できるようにしたいと考えています。
class Company {
String name
Company parent
Company alias
}
そうです、self には複数の関係がありますが、それらには非常に明確な意味があります。GORM が最も頻繁に使用される単純なケースをデフォルトとして使用することは理解していますが、DSL でできる限りのことを行って GORM に正しいことを指示するようにしています。ものですが、失敗しました。
これを行う従来の方法は、mappedBy ディレクティブを使用して、双方向の 1 対多の関係を追加することです。
class Company {
String name
Company alias
static belongsTo=[parent:Company]
static hasMany=[children:Company]
static mappedBy=[children:'parent']
}
しかし、多くの GORM 記事では、深刻なパフォーマンスの問題のため、このイディオムは推奨されていません。だから一方向の関係が欲しい
Company ---(parent)---> Company