Paul Fisher
Paul Fisher

Reputation: 9666

Grails many-to-many relationship across the same table

I'm using Grails and I want to have a unidirectional many-to-many relationship.

In my application, an Employee can "bookmark" another Employee in order to quickly access them to leave notes. Employees need not know who has bookmarked them.

In other words, I essentially want to have an employee.bookmarks property that I can use for this.

Thus far, I've found the documentation on many-to-many relationships for Grails ORM, but this seems to be exclusively across two different tables.

Upvotes: 0

Views: 910

Answers (2)

Hoàng Long
Hoàng Long

Reputation: 10848

You can use transient properties and an additional table "Bookmark" to do this task:

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]
    }
    ...
}

This method uses table "Bookmark" to store the relations between employees, so it is possible to have 2 people bookmark the same employee. Note that class Bookmark must implements Serializable.

Upvotes: 0

Burt Beckwith
Burt Beckwith

Reputation: 75681

Sounds like you just need a regular unidirectional 1-many:

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

Upvotes: 6

Related Questions