(未能懒惰地初始化集合,没有会话或会话被关闭)石英-0.4.2中的错误在grails 1.3.7中

时间:2013-12-06 15:04:53

标签: java hibernate grails gorm quartz-scheduler

作业

 class PicSchedulerJob {
        def myDataService
        def springSecurityService
        static triggers = {
            simple name:'picsJob', startDelay:1000,repeatInterval:30*60*1000 
        }
        def group = "icsJobGroup"

        def execute() {

            def userList=User.list()
            userList?.each{User user->  
                def fullList= Album.findAllByUser(user) 
                springSecurityService.reauthenticate(user.username)
                fullList?.each{Album a->
                    myDataService.removePicsFilter( a)          
                }

            }
        }
    }

方式:

def removePicsFilter(Album a){
        def tempList=a.photo
        int siz=tempList.size()?:0
        for(int i=0;i<siz;i++)  {
            Photo photodb=tempList[i]
            PhotoConnection photoConnection=PhotoConnection.findByPhoto(photodb)
                photoConnection?.tags.each{
                    Tag t=Tag.get(it.id)
                    t.delete()
                    }


        }
        a.save(validate:true,flush:true)
    }

错误:2013-12-06 20:20:59,618 [quartzScheduler_Worker-5]错误hibernate.LazyInitializationException - 懒得初始化集合,没有会话或会话被关闭 org.hibernate.LazyInitializationException:懒得初始化集合,没有会话或会话被关闭     在org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)

作业是石英作业代码,作业调用的方法代码,它的错误是我面临的错误..我也尝试使用Album.withTransaction和Album.withSession但不能修复它的代码。请指导我

2 个答案:

答案 0 :(得分:3)

问题是Hibernate会话未打开或已关闭。 请浏览http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.html#performance-fetching-lazy

链接

也可能是对象与hibernate会话分离。你可以试试这个:

将对象附加回hibernate会话,如下所示:object.attach()(http://grails.org/doc/2.2.1/ref/Domain%20Classes/attach.html) 使两个域类之间的关联非惰性(http://grails.org/doc/2.2.x/ref/Database%20Mapping/lazy.html

答案 1 :(得分:1)

希望它会有所帮助。

在Transactional中使用Hibernate.initialize()来初始化惰性对象。

 start Transaction 
      Hibernate.initialize(album.photo());
 end Transaction 

 out of Transaction
   tempList=album.photo