2011-03-24 18 views
0

私はGrailsを使用しており、単方向の多対多の関係を持ちたいと思っています。Grailsは同じテーブルの多対多関係

私のアプリケーションでは、従業員は別の従業員をすぐにノートに残すためにアクセスするために「ブックマーク」することができます。従業員は誰にブックマークを付けたのかを知る必要はありません。

つまり、私は基本的にこれに使用できるemployee.bookmarksのプロパティを持っています。

これまでのところ、私はGrails ORMのためにdocumentation on many-to-many relationshipsを見つけましたが、これは排他的に2つの異なるテーブルにあるようです。

答えて

6

あなただけの1対多の正規の一方向性を必要とするような音:

class Employee { 
    ... 
    static hasMany = [bookmarks: Employee] 
} 
+0

複数の従業員が同じ従業員をブックマークすることを許可しますか?つまり、「employeeA」と「employeeB」の両方が「employeeC」にブックマークされている。 –

+0

はい - このモデルでは、関連ユーザーを格納するための結合表が作成されるため、複数の参照に制限はありません。 –

-1

私があなたがしたいことは、Employee.bookmarksを使ってブックマークしている従業員のデータベースIDを保存することだと思います。これを行うことで、リスト機能を使用して従業員のリストを取得できますか?あなたが2つのクラスとしてこれをしたくない理由はありますか?

0

あなたはこの作業を行うにはtransient propertiesと追加のテーブル「ブックマーク」を使用することができます。

class Employee { 

    String name 
    static transients = ["bookmarks"] 

    def getBookmarks() { 
     Bookmark.findAllByBookmarker(this, [sort: "id", order: "asc"]) 
    } 
    ... 
} 

class Bookmark implements Serializable { 

    Employee bookmarker // the employee who bookmark someone 
    Employee bookmarkee // the employee who is bookmarked 

    static mapping = { 
    table "Bookmark" 
    id composite: ['bookmarker', 'bookmarkee'] 
    bookmarker(column: "BOOKMARKER_ID") 
    bookmarkee(column: "BOOKMARKEE_ID") 
    version false 
    } 

    static Bookmarker get(long bookmarkerId, long bookmarkeeId) { 
     find 'from Bookmark where bookmarker.id=:bookmarkerId and bookmarkee.id=:bookmarkeeId', 
      [bookmarkerId: bookmarkerId, bookmarkeeId: bookmarkeeId] 
    } 
    ... 
} 

このメソッドは、テーブルを使用しています従業員の関係を保存するための「ブックマーク」は、2人で同じ従業員をブックマークすることも可能です。クラスBookmarkはSerializableを実装する必要があることに注意してください。