Проблемы с отображением классов предметной области Grails в joinTable

Трудно найти ответ на этот вопрос в документации Grails, книге GIA или SO.

Я прививаю Grails к устаревшей базе данных. У меня есть две таблицы, и их связь друг с другом находится в существующей таблице соединений внешних ключей.

Из того, что я читал, кажется, что с аргументом joinTable вы можете указать какое поле из исходной таблицы используется в таблице соединения, но не имя столбца внешнего ключа < / strong> в таблице соединений. Одна таблица в этой базе данных следует соглашению (таблица видео имеет столбец идентификатора, а в таблице объединения называется «video_id»; другая таблица - нет (таблица PublisherCategory имеет столбец идентификатора, но представлена ​​в таблице объединения как «category_id» . "

Когда Grails запускается, он жалуется либо на повторяющиеся поля «id», либо на несуществующее поле в таблице соединения. (Мне не ясно из документов, является ли аргумент столбца в joinTable именем столбца в этом классе, который используется в качестве внешнего ключа, или, если он предназначен для имени внешнего ключа, как он отображается в joinTable. Я работал над убеждением, что это первое.)

Я также попытался создать класс предметной области для представления самой таблицы соединений с отношениями hasMany для обеих исходных таблиц, но Grails это тоже не понравилось. (Требуется, чтобы одна сущность была «владельцем», но установка любого домена в качестве владельца не сработала.)

Какие-либо предложения?


person ScottyDont    schedule 18.08.2015    source источник


Ответы (1)


Аргумент column в joinTable - это не внешний ключ, это значение. Для многие-ко-многим необходимо установить вверх по карте с обоих направлений. Итак, с такой схемой:

ВИДЕО - | -------- | ‹(video_id) THE_JOIN_TABLE (category_id)> | -------- | - PUBLISHER_CATEGORY

можно смоделировать как классы домена следующим образом:

class PublisherCategory {
    hasMany = [videos: Video]
    static belongsTo = Video

    static mapping = {
        videos joinTable: [
            name: 'the_join_table',
            key: 'category_id'
        ]
    }
}

class Video {
    static hasMany = [categories: PublisherCategory]

    static mapping = {
        categories joinTable: [
            name: 'the_join_table',
            key: 'video_id'
        ]
    }
}
person Emmanuel Rosa    schedule 18.08.2015
comment
Очень полезно, но все еще не понимает, что означает «столбец» (как обратное в документации Grails) в этом контексте. - person ScottyDont; 18.08.2015
comment
Ну, процитирую один из ваших вариантов, это ... имя внешнего ключа, как оно отображается в joinTable. Это не имя свойства в классе. - person Emmanuel Rosa; 18.08.2015