2011-03-24 53 views
0

我在使用Grails,我想要有一个单向的多对多关系。Grails在同一张表上的多对多关系

在我的应用程序中,员工可以“书签”另一个员工以便快速访问他们以留下笔记。员工不需要知道谁已为他们添加书签。

换句话说,我基本上想要一个employee.bookmarks属性,我可以使用这个。

到目前为止,我已经找到了Grails ORM的documentation on many-to-many relationships,但是这似乎是跨越两个不同的表。

回答

6

听起来像是你只需要一个普通的单向一对多:

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

这是否允许多名员工为同一员工添加书签?即'employeeA'和'employeeB'都有'employeeC'的书签。 – 2011-03-25 01:45:48

+0

是的 - 此模型创建一个连接表来存储相关用户,所以对多个引用没有限制。 – 2011-03-25 05:17:06

-1

根据你的意思我认为你想要做的就是使用Employee.bookmarks来存储被书签的员工的数据库ID。通过这样做,您可以使用列表功能获取员工列表?你有没有这样做的理由,你不想做两个班?

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。