Grails GORM Доменные отношения класса - PullRequest
0 голосов
/ 03 декабря 2009

Граальс 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)
  }
}

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

def book2 = Book.findAllByAuthor(author)

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

def book3 = Book.findAllByPublisher(publisher)

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

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

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

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 03 декабря 2009

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

static mapping = {
    books lazy:false
}

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

static fetchMode = [books:"eager"]

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

0 голосов
/ 13 декабря 2015

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

Пример:

def c = Teacher.createCriteria()

List<Teacher> results = c.list {
            subjects {
                attendees {}
            }
        }
0 голосов
/ 04 декабря 2009

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

...