Отношение 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 и т. Д.