Grails / Gorm:声明对象和描述关系之间的区别?

时间:2011-03-13 03:27:14

标签: grails gorm grails-domain-class

我无法理解在另一个域中声明域对象与指定域之间的关系之间的区别。

示例代码:

class User { 
Book book
}

class User { 
static hasOne = Book
}

class Book {
String name
}

2 个答案:

答案 0 :(得分:3)

hasOne关系会将密钥放在子对象上,因此在数据库中,如果您只声明book.user_id,则会找到包含hasOne而不是user.book_id的{​​{1}}在用户。如果使用Book book,您将看到生成的DDL的差异。

这是具有hasOne的DDL:

grails schema-export

以下是用户名为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

请注意,book表在第一个示例中有引用,用户在第二个示例中有引用。

答案很长:我强烈建议您在GORM /集合/映射上观看Burt Beckwith's presentation。关于GORM的大量信息以及描述与hasMany / belongsTo等关系的各种优势/问题的后果。

答案 1 :(得分:1)

主要区别在于,当使用hasOne时,外键引用存储在子表而不是父表中,即user_id列将存储在book表中而不是存储在user表中的book_id列中。如果您没有使用hasOne,那么将在用户表中生成book_id列。

Grails documentation for hasOne中有一个解释和示例。

希望这有帮助。