У меня есть доменные классы:
class Child {
static hasMany = [ toys : Toy ]
String name
Set toys
}
class Toy {
static belongsTo = [ owner : Child ]
String name
}
В моем JSP я ссылаюсь на ребенка:
child = Child.findByName("Joe")
или же
child = Child.findById(123)
Но когда я пытаюсь получить доступ к его полям:
child.getToys()
Я получаю сообщение об ошибке:
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: Child.toys, no session or session was closed
Нужно ли мне вручную запускать сеанс гибернации? Если да, то как мне это сделать?
Последующие действия, февраль 2012 г.: это поведение также присутствует при запуске из консоли Grails (Grails 2.0.0)





Это связано с недостатком Grails 1.0.4, касающимся отложенной инициализации Hibernates. В качестве обходного пути вы можете принудительно получить эти свойства:
child = Child.findByName("Joe", [ fetch: [ toys: 'eager' ] ] )
Помимо этого, следуя принципам MVC, вам следует рассмотреть возможность выполнения этих запросов внутри контроллера и включения результатов в модель.
Кстати. вы действительно делаете это внутри JSP? Или это ГСП?
Ваше здоровье
Я попытался установить для извлечения значение «нетерпеливо», но теперь в игрушках отсутствует большая часть содержимого. Другими словами, если я не укажу fetch eager, все игрушки будут загружены. Если указать fetch eager, то загружается только 10-20% игрушек.
Это странно. Я видел проблему в JIRA (GRAILS-3712). В качестве последнего обходного пути вы можете определить коллекции, которые вы используете в представлениях, которые будут с нетерпением извлекаться по умолчанию: // (внутри класса домена) статическое сопоставление {toys lazy: false} Это должно решить проблему на данный момент.
Это из JSP. Я модифицирую устаревшее приложение, которое запрашивает из представления. Мне просто нужно изменить его, чтобы он соответствовал шаблону MVC Spring / Grails.