2017-07-20 3 views
0

私はgrailsを初めて使っていて、何かを作成しようとしていますが、ドメイン設計上大きな問題があります。GORMは2つのクラス間で1対多の関係でテーブルを作成しません

基本的に私はこのような構造をしたいのですが:

ユーザーは多くのバスケットを持って

バスケットは多くのユーザーを持っており、内部に多くのボックスを持っており、多くの宝石

Aボックスであることができますバスケットの中にたくさんの宝石があります

各宝石には多くの所有者がいます。

ユーザーがバスケットを作成することができ、彼は(作成)ボックスを置くことができるバスケットの内側、およびボックス内のジュエルは、他のユーザーを追加/削除することができます(作成)置くことができる(それも所有者になります)に バスケットと宝石に、バスケットの所有権から自分自身を取り除くと、他のユーザーはまだバスケットを所有しています。誰もバスケットを所有していなければ、バスケットは消えます。

ユーザはボックスを削除することができ、内部の宝石はバスケットで終わり、ユーザは宝石であるボックスで編集することができます。

私はそれらのドメインに来ましたが、私はバスケットを作成しても自分自身をUser BasketListに追加したり、UserListというバスケットを作成したりすることはできません。

class User{ 

    String name 

    static hasMany = [basketList: Basket, jewelList: Jewel, kanbanCards: KanbanCard] 

    } 

class Basket{ 

    String name 

    static hasMany = [userList: User, boxList: Box, jewelList: Jewel] 

    } 

class Box{ 

    String name 
    static belongsTo = Basket 
    static hasMany = [jewelList: Jewel] 

    } 


class Jewel{ 

    String name 
    static belongsTo = Basket 
    static hasMany = [userList: User] 

    } 

これらのドメインのいずれかが正しいですか?私はそれが機能するために欠けているものは何ですか?

編集:私は(メソッドを作成し、足場を使用して)バスケットを作成しようとすると、私はすべてのユーザーのリストを持っている

class User{ 

    String name 

    static hasMany = [basketList: Basket, jewelList: Jewel, kanbanCards: KanbanCard] 
    static mapping = { //added joinTable proprerty for many-to-many 
     basketList joinTable: [name: "mm_user_basket", key: 'mm_user_id' ] 
    } 

    } 

class Basket{ 

    String name 

    static belongsTo = User //added belongsTo 
    static hasMany = [userList: User, boxList: Box, jewelList: Jewel] 

    static mapping = { //added joinTable proprerty for many-to-many 
     userList joinTable: [name: "mm_user_basket", key: 'mm_basket_id' ] 
    } 

} 

class Box{ 

    String name 
    static belongsTo = Basket 
    static hasMany = [jewelList: Jewel] 

    } 


class Jewel{ 

    String name 
    static belongsTo = Basket 
    static hasMany = [userList: User] 

    } 

は、だから今私はこのようなドメインを変更しました私はそれらのうちの1つを選択しますが、保存すると、関連付けられているユーザーがいない名前の新しいバスケットが作成されます。

+0

を私は非常にこのhttps://www.youtubeを見てお勧めします。 com/watch?v = VUMQGrNi2F0基本的に、すべての頭痛を抱えて、ドメインクラスのセットやリストを使って、他のクラスから必要なものを得ることができます。しかし、一時的なショッピングカートオブジェクトを格納するためにドメインクラスを使用して誤解を完全に犯しているのではないかと思います。検証ビーンを使用してそのすべてを収集し、すべてを処理して保存するのが良い時です。ユーザーがカートに何かを追加したり削除したりするたびに収集するのであれば、巨大なデータベースになります – Vahid

+0

一時ファイルを保存するためにDomainクラスは必要ありません。 私はそれらのオブジェクトのすべてを永続的でアドレッシングできるものにする必要があります(例:与えられたユーザーのすべてのバスケットのリスト、彼が "開く"ことができ、その中に与えられたバスケットのすべてのボックスが表示されます)。 あなたのビデオを見て、私はかなりそれから学ぶことがたくさんあることを確かめて、ありがとう! – baboo

答えて

0

新しいオブジェクトが関係にカスケードされるように、ユーザーまたはバスケットは関係を「所有する」必要があります。

だから、バスケットクラスに追加する必要があります。

static belongsTo = User 

あなたがここで詳細を読むことができる:

https://chrisbroadfoot.id.au/2008/07/19/many-to-many-relationship-mapping-with-gorm-grails/ http://docs.grails.org/3.1.1/ref/Database%20Mapping/joinTable.html

+0

これを行うと、私はバスケットのuserListからバスケットを作成したユーザーを削除するとどうなりますか? – baboo

+0

他のユーザーが関連付けられている限り、これは問題ありません。最後のユーザーを削除した場合は、バスケットも削除する必要がありますが、これは、わかっている限り、あなたがやりたいことです。 – Kloker

+0

私は新しい情報で私の質問を編集しましたが、私がドキュメントで読んだことにもかかわらず、私はまだ間違っています。 – baboo

関連する問題