Причиной дополнительной таблицы является то, что вы смоделировали связь только в одном направлении - Example
может получить доступ к его ExampleData
экземпляров через example_array
набор, который добавил в свой класс байткод из-за hasMany
собственности, но ExampleData
экземпляр не имеет возможности ссылаться на свое владение Example
.
Вы добавили свойство belongsTo
, но указали только имя класса. Этого достаточно для настройки прав собственности, каскадных удалений и т. Д., Но не предоставляет свойства класса для доступа к экземпляру Example
.
Если изменить его на другой поддерживаемый синтаксис будет работать, как вы ожидали:
static belongsTo = [example: Example]
Здесь example
будет в конечном итоге название из Example
собственности (и вы можете изменить его и/или example_array
к любое допустимое имя свойства), что в основном такой же, как объявить
Example example
Теперь, когда обе стороны могут получить доступ к другим, отношение является двунаправленным, и вы больше не нуждается в третьей таблице. Это потому, что 1-много обычно реализуется с использованием внешнего ключа в дочерней таблице, в этом случае в таблице для ExampleData
, которая указывает на таблицу для Example
. Это невозможно без свойства в классе, чтобы подключиться к этому столбцу, поэтому необходима таблица соединений.
Нет, вам не нужно присваивать 'Map'' 'принадлежитTo'. Вы можете назначить «Карта» или «Класс». Если вы используете «Map», то в классе, который определяет 'ownTo', добавляется обратная ссылка. Если вы используете 'Class', этого не происходит. См. Http://docs.grails.org/3.1.11/ref/Domain%20Classes/belongsTo.html. –
Если вы используете «Карта», схема будет отличаться, и это может быть то, что вы хотите, но это не значит, что вам нужно использовать «Карта». –
Хорошо, но он хочет избавиться от третьего стола, это сделает это. Берт Беквит объяснил хорошими словами. –