1

一見、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 がこれを行うのは、onetwoの間に双方向の関係があると推測し、オブジェクト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
4

2 に答える 2

1

ここで使用される適切な制約があるべきではありませんか?次の変更を加えたので、出力が異なるので、疑問に思います

class Mydomain {
    String name
    Mydomain alias
    Mydomain foo

    static belongsTo = [parent:Mydomain]

    static constraints = {
        parent(nullable: true)
        alias(nullable: true)
        foo(nullable:true)
    }
}

テスト出力(多分これはあなたが期待していたものです)

one
null
null
============================
two
null
null
============================

ドメインシナリオについてさらに詳しく教えていただければ、これをさらに詳しく説明することができます。それ以外の場合、GORMは、制約が指定されていないため、カーディナリティを自動的に設定します。

免責事項:私はGrails2.0.1を使用しています

更新(26/04/12): ビジネスケースを考えると、以下に示すような改造は効果がありますか?

class Mydomain {
    String name

    static belongsTo = [parent:Mydomain]

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

class MydomainAlias {

    Mydomain me 
    Mydomain alias

    static constraints = {
        me (unique: 'alias')
    }
}

基本的に、これによりエイリアシングが別のテーブルに分離されます。Grailsは、外部キーの依存関係を自動的に生成します。サンプルのスキーマエクスポートは次のようになります

create table mydomain (id bigint not null auto_increment, version bigint not null, name varchar(255) not null, parent_id bigint, primary key (id));
create table mydomain_alias (id bigint not null auto_increment, version bigint not null, alias_id bigint not null, me_id bigint not null, primary key (id), unique (alias_id, me_id));
alter table mydomain add index FKECA5F170DF99DE64 (parent_id), add constraint FKECA5F170DF99DE64 foreign key (parent_id) references mydomain (id);
alter table mydomain_alias add index FKA70D16C16A628AB6 (me_id), add constraint FKA70D16C16A628AB6 foreign key (me_id) references mydomain (id);
alter table mydomain_alias add index FKA70D16C1CA5FA6FE (alias_id), add constraint FKA70D16C1CA5FA6FE foreign key (alias_id) references mydomain (id);
于 2012-04-25T09:17:45.620 に答える
1

JIRAの問題を投稿した後 http://jira.grails.org/browse/GRAILS-9062?focusedCommentId=70641#comment-70641

メーリングリストでのいくつかの交換、

http://markmail.org/message/xcmcclr2lv7ecrbn

解決策は Graeme Rocher によって提案されました。

次のmappedByクロージャーを追加するだけです

static mappedBy = [
    parent: 'null',
    alias:'null',
    foo:'null'
]

これにより、GORM は双方向の関係が必要であると仮定しないようになります。

あなたの専門家の助けに感謝します!

于 2012-04-26T12:21:04.470 に答える