Полиморфное принадлежит многим ко многим картографированию в граалях? - PullRequest
3 голосов
/ 08 мая 2011

Так что я знаю, что это возможно при использовании суперкласса, однако это очень ограничивает гибкость.Итак, мой вопрос, могу ли я использовать интерфейс?Что-то аля.

interface Taggable {
  /*Adds tag(s) and returns a list of currently set tags*/
  List<String> addTags(String ... tag)
  /*Removes tag(s) and returns a list of currently set tags*/
  List<String> removeTags(String ... tag)
}

class User implements Taggable {
  String username
  static hasMany = [tags:Tag]
}

class Tag {
  String name

  static hasMany = [references:Taggable]
  static belongsTo = Taggable

  static constraints = {
    name(nullable: false, blank: false, unique: true)
  }
}

Меня интересует ссылка на объект, который имеет следующий тег.Однако этот объект не может расширять конкретный класс.Вот почему я задаюсь вопросом, можно ли это сделать с помощью интерфейса.

Итак, можно ли это сделать?

1 Ответ

4 голосов
/ 10 мая 2011

Hibernate может сопоставить интерфейс - см. Пример . Я сомневаюсь, что Grails поддерживает это в соответствии с соглашением, но вы можете попробовать использовать отображение аннотации из приведенного выше примера или XML config.

edit : ответ на вопрос с комментарием:

На уровне базы данных у вас должна быть таблица Taggable, чтобы Tag.References мог ссылаться на внешний ключ.

  1. Дискриминатор НЕ будет побеждать полиморфизм, если он добавлен автоматически - например, в отображении таблицы на иерархию, Hibernate / Gorm добавляет поле class, чтобы найти конкретный класс при чтении объекта из БД .

  2. Если вы сопоставите свои Taggable s с двумя таблицами - Taggable part с Taggable, а все остальное - с конкретной таблицей со ссылкой 1: 1 - вся работа по распознаванию должна быть выполнена за вас Hibernate.

BTW class поле довольно длинное - оно содержит полное имя класса .

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

  • динамически запрашивает все классы с интерфейсом Taggable для свойства hasMany=[tags:Tag];
  • или, что менее предпочтительно, - иметь ручной дочерний стол и дискриминатор.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...