2013-08-05 4 views
8

Чтобы получить столбец внешнего ключа (без соединения) при сопоставлении однонаправленного отношения OneToMany, я следую инструкциям в соответствии с справочной документацией Grails (версия 2.2.3), section 6.5.2.1 Отображение OneToMany, которое содержитОднонаправленные отношения OneToMany без joinTable

С однонаправленными ассоциациями внешний ключ должен быть указан в самой ассоциации. В приведенном примере однонаправленный OneToMany отношения между Person (заменен на один) и адрес (заменен Many), следующий код изменит внешний ключ в Many таблице

class One { 

    static hasMany = [manyCollection:Many] 
    static mapping = { 
     manyCollection(column:"ONE_ID") 
    } 

} 

Однако, когда я бегу

One one = new One() 
one.addToManyCollection(new Many()) 

one.save() 

я получаю в консоли

insert 
into 
    one 
    (id, version) 
values 
    (null, ?) 

insert 
into 
    many 
    (id, version) 
values 
    (null, ?) 

insert 
into 
    one_many 
    (one_many_collection_id, many_id) 
values 
    (?, ?) 

Примечание Grails кр eate joinTable называется one_many. Итак, мой вопрос: это ошибка или что-то еще? Что я должен сделать, чтобы избавиться от joinTable?

Даже когда я использую что-то вроде

class One { 

    static hasMany = [manyCollection:Many] 
    static mapping = { 
     manyCollection(joinTable:false) 
    } 

} 

как было подчеркнуто here, я получаю тот же результат

ответ

10

Вы почти там, у вас есть две половинки картографии, но вам нужно, чтобы они работали правильно. Это не хорошо документированная функция, но я использовал это раньше, и это определенно работает (например, нет таблицы соединений). Так что в вашем одном классе,

class One { 
    .. 
    static mapping = { 
    manyCollection column: "ONE_ID", joinTable: false 
    } 
} 

Примечание: это, вероятно, хорошая идея, чтобы выйти, чистый и перезапустить Grails при внесении изменений отображения. Я потерял много часов, ударяя головой, когда простым чистым граалем было решение.

Кроме того, вы могли бы технически добавить belongsToбез обратной ссылки в вашем Many класса, и вы бы до сих пор истинный однонаправленный, но с дополнительным преимуществом каскадных действий (отображаются в одном классе), если это то, что вам нужно ,

+0

Неправильная справочная документация. ** Мы должны использовать joinTable: false ** вместо столбца. Если я использую только столбец, как указано в документации, будет создан joinTable. –

0

Следующая установка будет реализовывать то, что вы говорите:

class One { 
    static hasMany = [manyCollection: Many] 
} 

class Many { 
    static belongsTo = [one: One] 
} 

Если вы хотите удалить многие из них, если они удаляются из коллекции, добавьте:

class One { 
     static mapping = { 
      manyCollection cascade: 'all-delete-orphan' 
     } 
    } 
+0

Ваше решение является двунаправленным отношением, а не однонаправленным –

Смежные вопросы