Grails GORM findAll возвращает нулевую коллекцию

Рассмотрим следующие модели предметной области:

class Sales{
    String salesInvoice
    Customer customer
}

class Customer{
    int customerNumber
    String name
}

Проблема: я пытаюсь получить все данные о продажах клиента. Таким образом, код:

def sales = Sales.findAllByCustomer(Customer.get(params.id))

У меня нет проблем с получением клиента. Но когда я использую println sales.dump(), я получаю что-то вроде

<java.util.ArrayList@d3a25f8 elementData=[mypackage.Sales : null, mypackage.Sales : null] size=2 modCount=3>

Если я правильно понимаю, это означает, что запрос смог получить список Sales, но я не совсем понимаю, почему он возвращает список нулей? Я пробовал нетерпеливую выборку, но не думаю, что это сработает в этой конкретной проблеме. Итак, как мне получить список ненулевых объектов Sales?


person LJ Dee    schedule 09.04.2012    source источник
comment
Какую версию Grails вы используете? Может быть, вы используете измененную обработку привязки данных в 2.0.2?   -  person stefanglase    schedule 09.04.2012
comment
Я все еще использую 2.0.0. Как новые изменения привязки данных влияют на мой код? Должен ли я использовать другой синтаксис или где-то добавить другую конфигурацию?   -  person LJ Dee    schedule 09.04.2012
comment
Взгляните на следующий блог, описывающий изменения. blog.springsource.org/2012/03/28 / Эта функция использовалась по умолчанию в версии 2.0.2, но была изменена по умолчанию в версии 2.0.3 из-за того, что она является критическим изменением для многих рабочих кодов.   -  person stefanglase    schedule 12.04.2012


Ответы (1)


Показанные вами объекты не являются NULL, но id объектов в настоящее время имеет значение NULL: каждый доменный объект Grails имеет метод toString(), который выводит ${name of the class} : ${id of the instance}. Если вы получаете выходные данные, как вы показали, это обычно означает, что ваши экземпляры существуют (иначе был бы выброшен NPE!), Однако идентификатор еще не получен из БД.

  1. Я предполагаю, что вы создаете объекты в коде раньше. Вам нужно очистить контекст, иначе идентификаторы не будут созданы.
  2. Вы должны объявить, что ваш Sale принадлежит Customer. http://grails.org/doc/latest/guide/GORM.html#manyToOneAndOneToOne

Кстати: назовите свои доменные классы в единственном числе. Так что переименуйте Sales в Sale.

person Chris    schedule 09.04.2012
comment
Ты прав. Список не нулевой. Я предполагаю, что Grails пытался получить атрибут id, но вместо этого мой первичный ключ был назван salesInvoice. Что касается соглашения об именах, я знаю. Виновен по обвинению. :) - person LJ Dee; 10.04.2012