2015-08-20 2 views
0

мне интересно, в чем разница между этими двумя определениями:необходимо ли явно определять переменную belongsTo как свойство домена grails?

class Book{ 

     String title 
     Author author 
     static belongsTo = [author: Author] 

    } 



class Book { 
    String title 
    static belongsTo = [author: Author] 
} 

Мои сомнения, является ли явно объявить переменную, как в первом примере является необязательным или первое определение отличается от второго определения? Благодаря!

ответ

2

Они одинаковы, но это не очевидно, почему. Во втором примере, даже если вы не объявляете свойство Author, оно существует, потому что Grails использует преобразование AST, чтобы добавить свойство для вас. Свойство belongsTo - это карта; ключ (author) используется как имя переменной, а значение используется как тип. Таким образом, свойство Author author в первом примере избыточно, потому что оно было бы добавлено для вас во время компиляции.

Не помешает включить его и может помочь в IDE, которая не очень осведомлена о Grails с автозаполнением.

Точно так же, Grails добавляет Long id и Long version свойства (опуская версию, если у вас есть version false в mapping блоке), так что вы можете добавить их в свой код, но они также могут быть излишними. Конечно, если вам нужно изменить тип идентификатора, вы должны быть явным.

Если у вас есть hasMany property in Author class, eg.

static hasMany = [books: Book] 

Grails также добавит имущество, основанное на этой декларации. Опять же, свойство - это карта, а значение указывает тип элементов коллекции, а ключ указывает имя свойства. Таким образом, вы фактически получаете

Set<Book> books 

Недвижимость. Вы можете добавить это в свой код (обычно без общего типа, Set books), но это не нужно, поскольку большинство IDE знают, что добавляет Grails.

Вы бы добавить, что недвижимость в код, если вы хотите изменить от типа по умолчанию Set к List:

List books 

, но только если это имеет смысл заказывать их в базе данных.

Обратите внимание, что эти имена переменных являются только условными обозначениями. Вы можете назвать Author и свойства книг, которые вам нравятся, например.

static belongsTo = [writer: Author] 

, который бы добавить Author writer собственность и

static hasMany = [tomes: Book] 

, который бы добавить Set tomes собственность.

2

Конечный результат на уровне базы данных - таблица книг будет иметь столбец author_id в качестве внешнего ключа для таблицы author.

belongsTo - задает поведение каскадный для сохранения/удаления и обеспечивает обратную ссылку на автора, так что вы можете сделать bookInstance.author

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