2016-09-21 1 views
0

Привет, У меня есть простая проблема. Мой класс домен, как это:Grails: Простое hasMany отношение создать больше таблиц, чем необходимо

class Example { 

    long seq 

    hasMany = [example_array: ExampleData] 

    long count 
} 

class ExampleData { 

    String type 

    long description 

    static belongsTo = Example 

    static constraints = { 
    } 
} 

Это приводит к 3 таблицы, как многие ко многим отношений. Почему это?

Благодаря

ответ

0

Я считаю, что вы должны сопоставить BelongsTo, как это:

static belongsTo = [example:Example] 

Надеется, что это помогает :)

+0

Нет, вам не нужно присваивать 'Map'' 'принадлежитTo'. Вы можете назначить «Карта» или «Класс». Если вы используете «Map», то в классе, который определяет 'ownTo', добавляется обратная ссылка. Если вы используете 'Class', этого не происходит. См. Http://docs.grails.org/3.1.11/ref/Domain%20Classes/belongsTo.html. –

+0

Если вы используете «Карта», схема будет отличаться, и это может быть то, что вы хотите, но это не значит, что вам нужно использовать «Карта». –

+0

Хорошо, но он хочет избавиться от третьего стола, это сделает это. Берт Беквит объяснил хорошими словами. –

0

Из определения hasMany Grails, по умолчанию, карта такого рода отношения с таблицей join.That join table - это третья таблица, которую вы упомянули. Не нужно беспокоиться об этом.

0

Ну one-to-many relationship строится путем иметь дополнительную таблицу (т.е. Example_ExampleData), содержащий два столбца каждый id полей из таблиц сущностей, образующих связь (то есть. Example и ExampleData).

Вновь добавленная таблица является дочерней по отношению к родительским таблицам - Example и ExampleData.

Так что в вашем случае, когда вы запускаете приложение, 3-й стол создается по умолчанию Grails, так как отношение вашей таблицы относится к one-to-many relationship.

1

Причиной дополнительной таблицы является то, что вы смоделировали связь только в одном направлении - Example может получить доступ к его ExampleData экземпляров через example_array набор, который добавил в свой класс байткод из-за hasMany собственности, но ExampleData экземпляр не имеет возможности ссылаться на свое владение Example.

Вы добавили свойство belongsTo, но указали только имя класса. Этого достаточно для настройки прав собственности, каскадных удалений и т. Д., Но не предоставляет свойства класса для доступа к экземпляру Example.

Если изменить его на другой поддерживаемый синтаксис будет работать, как вы ожидали:

static belongsTo = [example: Example] 

Здесь example будет в конечном итоге название из Example собственности (и вы можете изменить его и/или example_array к любое допустимое имя свойства), что в основном такой же, как объявить

Example example 

Теперь, когда обе стороны могут получить доступ к другим, отношение является двунаправленным, и вы больше не нуждается в третьей таблице. Это потому, что 1-много обычно реализуется с использованием внешнего ключа в дочерней таблице, в этом случае в таблице для ExampleData, которая указывает на таблицу для Example. Это невозможно без свойства в классе, чтобы подключиться к этому столбцу, поэтому необходима таблица соединений.