Взаимосвязь класса домена Grails GORM

Grails 1.1.1 Goovy 1.5.7

В таких отношениях:

Автор 1 -- n Книга n -- 1 Издатель

Определено в Grails:

class Author {        
  String firstName
  String lastName

  static hasMany = [books: Book]       

  static constraints = {
      books(nullable: true)
  }
}

class Book {        
  String title
  Author author
  Publisher publisher

  static constraints = {
    author(nullable: true)
    publisher(nullable: true)
  }
}

class Publisher {

  String name

  static hasMany = [books: Book]

  static constraints = {
      books(nullable: true)
  }
}

Я хочу загрузить книгу со значениями издателя и автора. Когда я получаю книгу с запросом:

def book2 = Book.findAllByAuthor(author)

Я получаю ответ с ассоциированным автором, но у издателя есть только класс идентификатора и имени в другом запросе:

def book3 = Book.findAllByPublisher(publisher)

Я получаю обратный результат: у меня есть книга с данными издателя, но у автора есть только идентификатор и имя класса.

Где ошибка в определенной модели? o есть ошибка в способе выполнения запросов?

Редактировать:

Мне нужен способ получить значения только с помощью такого запроса:

def book2 = Book.findAllByAuthor(author, [fetch:[publisher:'eager']])

В этом я могу управлять ценностью издателя.

Вопрос: Если у издателя есть отношение hasmany или Domain, получая книгу, я могу прочитать атрибуты?

Спасибо. Спасибо.


person Ricardo García    schedule 03.12.2009    source источник
comment
Grails 1.1.1 объединяет Groovy 1.6.3 ($GRAILS_HOME/lib/groovy-all-1.6.3.jar), и если вы не замените этот jar, то Grails 1.1.1 будет использовать Groovy 1.6.3. Ничего страшного, но комментарий достоин :-)   -  person Colin Harrington    schedule 03.12.2009


Ответы (3)


Ленивая выборка используется по умолчанию с ассоциациями gorm. Если вы хотите включить активную выборку, вы можете изменить ORM DSL, добавив следующий блок сопоставлений в свой класс домена Author:

static mapping = {
    books lazy:false
}

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

static fetchMode = [books:"eager"]

Делая то же самое с вашим объектом домена Publisher, вы должны позволить вам выполнить то, что вы хотите. Вы действительно хотите быть осторожными с тем, что вы можете загрузить больше данных, чем намеревались.

person Lloyd Meinholz    schedule 03.12.2009
comment
Спасибо. Но меня интересует другая сторона вопроса, потому что вы говорите: вы действительно хотите быть осторожным с тем, что вы можете загрузить больше данных, чем намеревались. - o есть ошибка в способе выполнения запросов? Я нашел решение, добавив параметр fetch в очередь: - def book2 = Book.findAllByAuthor(автор, [выборка:[издатель:'нетерпеливый']])) Я тоже получаю издателя. Что я могу сделать, если у издателя есть какой-либо другой объект, который мне нужно получить? добавление и добавление параметров. Спасибо. - person Ricardo García; 03.12.2009
comment
Если вы не определили другие объекты, на которые Publisher ссылается в режиме нетерпеливой выборки, вам, насколько мне известно, придется перебирать объект. - person Lloyd Meinholz; 03.12.2009
comment
Я не хочу повторять снова и снова, это моя проблема. Слишком много доступа к DDBB. Если я что-то нашел, я опубликую это здесь. Спасибо за ваше время и быстрые хорошие ответы. - person Ricardo García; 03.12.2009

Разве метод get() не должен возвращать то, что вы ищете? Пример: def book2 = Book.get(автор)

person timarmandpour    schedule 03.12.2009
comment
Плохо оформлено: def book2 = Book.get(author) Вот так: def book2 = Book.findByAuthor(author) У меня есть данные только из книги и авторского домена, а не из Издателя. - person Ricardo García; 09.12.2009

Вам лучше использовать критерии и явно указать, какие отношения должны загружаться с нетерпением. Просто укажите отношение в запросе.

Пример:

def c = Teacher.createCriteria()

List<Teacher> results = c.list {
            subjects {
                attendees {}
            }
        }
person Alexey Vetrov    schedule 13.12.2015