Grails / Gorm: Разница между объявлением объекта и описанием отношений? - PullRequest
4 голосов
/ 13 марта 2011

У меня возникают проблемы с пониманием разницы между объявлением доменного объекта в другом домене и указанием отношения между доменами.

Пример кода:

class User { 
Book book
}

против

class User { 
static hasOne = Book
}

class Book {
String name
}

Ответы [ 2 ]

3 голосов
/ 13 марта 2011

Отношение hasOne поместит ключ на дочерний объект, поэтому в базе данных вы найдете book.user_id с hasOne вместо user.book_id, если вы просто объявите Book book для пользователя.Вы увидите разницу в сгенерированном DDL, если будете использовать grails schema-export.

Вот DDL с установленным hasOne:

create table book (id bigint generated by default as identity (start with 1), version bigint not null, user_id bigint not null, primary key (id), unique (user_id));
create table user (id bigint generated by default as identity (start with 1), version bigint not null, primary key (id));
alter table book add constraint FK2E3AE98896CD4A foreign key (user_id) references user;

Вот DDL с Book book для пользователя:

create table book (id bigint generated by default as identity (start with 1), version bigint not null, primary key (id));
create table user (id bigint generated by default as identity (start with 1), version bigint not null, book_id bigint not null, primary key (id));
alter table user add constraint FK36EBCB952E108A foreign key (book_id) references book;

Обратите внимание, что таблица книг имеет ссылку в первом примере, а пользователь - во втором.

Длинный ответ: я настоятельно рекомендую посмотреть презентацию Берта Беквита на ГОРМ / Коллекции / Картирование.Много полезной информации о GORM и последствиях различных преимуществ / проблем с описанием отношений с hasMany / serveTo и т. Д.

1 голос
/ 13 марта 2011

Основное отличие состоит в том, что при использовании hasOne ссылка на внешний ключ сохраняется в дочерней таблице вместо родительской таблицы, то есть столбец user_id будет храниться в таблице book вместо столбца book_id, хранящегося в таблице user.Если вы не использовали hasOne, в пользовательской таблице будет создан столбец book_id.

В документации Grails для hasOne .

* 1006 есть объяснение и пример.* Надеюсь, это поможет.
...