Отношение «многие ко многим» в одной таблице - PullRequest
0 голосов
/ 25 марта 2011

Я использую Grails и хочу иметь однонаправленное отношение «многие ко многим».

В моем приложении Сотрудник может «добавить в закладки» другого Сотрудника, чтобы быстро получить к ним доступ и оставлять заметки. Сотрудникам не нужно знать, кто их добавил в закладки.

Другими словами, я хочу иметь свойство employee.bookmarks, которое я могу использовать для этого.

До сих пор я нашел документацию по отношениям "многие ко многим" для Grails ORM, но, похоже, это касается исключительно двух различных таблиц.

Ответы [ 2 ]

6 голосов
/ 25 марта 2011

Звучит так, будто вам просто нужен обычный однонаправленный 1-много:

class Employee {
   ...
   static hasMany = [bookmarks: Employee]
}
0 голосов
/ 25 марта 2011

Вы можете использовать переходные свойства и дополнительную таблицу «Закладка» для выполнения этой задачи:

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.

...