2013-07-16 2 views
3

Я могу использовать динамические искатели в своих классах домена в своем задании , но получаю org.hibernate.LazyInitializationException при доступе к отношениям. Я думал, что они либо будут работать, либо нет.org.hibernate.LazyInitializationException в задании кварца

class MyJob { 
    def author = Author.list().first() // fine 
    def book = Book.get(1) // fine 
    println author.books // lazy exception 
} 

Любая идея, почему это может произойти? Согласно документации плагина Quartz каждый поток заданий получает сеанс Hibernate, но я столкнулся с этой проблемой.

Grails 2.1.1, quartz:1.0-RC9

Полное Ошибка:

2013-07-16 16:08:10,008 [quartzScheduler_Worker-10] ERROR grails.plugins.quartz.listeners.ExceptionPrinterJobListener - Exception occurred in job: null 
org.quartz.JobExecutionException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: test.Author.books, no session or session was closed [See nested exception: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: test.Author.books, no session or session was closed] 
    at grails.plugins.quartz.GrailsJobFactory$GrailsJob.execute(GrailsJobFactory.java:96) 
    at grails.plugins.quartz.QuartzDisplayJob.execute(QuartzDisplayJob.groovy:29) 
    at org.quartz.core.JobRunShell.run(JobRunShell.java:213) 
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557) 
Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: test.Author.books, no session or session was closed 
    at test.MyJob$_execute_closure1$$EOBjSWum.doCall(MyJob.groovy:7) 
    at test.MyJob$$EOBjSWum.execute(MyJob.groovy:7) 
    at grails.plugins.quartz.GrailsJobFactory$GrailsJob.execute(GrailsJobFactory.java:89) 
    ... 3 more 
+2

Я не проверял это, но попытаться обернуть 'Def author' и' author.books' строки в withSession или закрытия withTransaction, увидеть, если это помогает – Alidad

+0

вы можете позволить себе нетерпеливый выборки ?, не уверен, но только попробуйте с ленивым ложным. –

ответ

7

MyJob не является артефактом grails, следовательно, по умолчанию не является транзакционным. Ассоциации, которые будут получать лениво, должны находиться под транзакционной границей.

Решение: -
Follow @ Alidad's comment.

class MyJob { 
    def author = Author.list().first() 
    def book = Book.get(1) 
    Book.withTransaction{ 
     //withSession can also be used. You can also use Autor.withTransaction. 
     //The entity reference is immaterial. 
     println author.books 
    } 
} 
+0

Я знал, что 'withTransaction' будет работать, но я не ожидал, что мне придется его использовать, учитывая, что для кварцевых потоков предусмотрен сеанс спящего режима. Очевидно, что сборка ассоциаций и запрос домена используют сеансы спящего режима таким образом, который я не понимаю ... – zoran119

+0

Добавление withTransaction работало для меня, но в итоге у меня возникла проблема с модульными тестами: groovy.lang.MissingMethodException: Нет сигнатуры метода: gvl.cert .EvfdEmailEntry.withTransaction() применим для типов аргументов:() значения: [] 'попытался отключиться с withSession с тем же результатом – aeischeid

+0

@aeischeid Убедитесь, что вы издеваетесь над классом домена соответствующим образом в тестовом примере Unit. Если это не издевается, вы не сможете получить динамические свойства класса домена. Используйте '@ Mock' или' @ Bind' (в случае, если вы используете плагин build-test-data) – dmahapatro

0

По умолчанию Горм несимметричных ассоциаций ленивы. См. documentation для получения дополнительной информации.

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