Grails GORM:无法初始化代理 - 没有会话

svz*_*svz 11 grails hibernate grails-orm

我有一个具有以下结构的方法:

public void run(){
    ... 
    for (...) { //this part works correct

        User.withTransaction {
            User user = User.findByUsername(...);

            Position pos = Position.findByName(...)
            if(pos){ ...
            } else { ...
                try{
                    pos.save(flush:true);
                    user.position = pos;
                } catch (Exception e){ ... }
            }
            ...
            try{
                user.save(flush:true, failOnError: true);
            } catch (Exception e){ ... }
        }
    }
    //this part doesn't work
    User.findAll().each {
    ...
        if (...){
            User.withTransaction{
                ...
                //here the operation fails with 
                //org.hibernate.LazyInitializationException: 
                //could not initialize proxy - no Session
                if (!userDetailsMap.containsKey(it.username) 
                         && it.userStatus != blocked){
                    it.userStatus = blocked
                    it.save(flush:true) 
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我到这里的例外是org.hibernate.LazyInitializationException: could not initialize proxy - no Session在我的代码的第二部分.这里的userStatus字段是对不同域类的引用.

我试图在检查属性之前添加it.refresh()Hibernate.initialize(it)代码,但没有用.我在这做错了什么?

upd:我试图it.attach在检查属性之前调用方法,但是在方法调用之后it.attached就是is false.

zor*_*119 20

我认为你没有做任何'错误',只是该对象与hibernate会话分离.我尝试过几件事:

  • 使域类之间的关联非懒惰最终有所帮助,但我认为这不是最好的解决方案.不过,它是迄今为止唯一的一个. (2认同)
  • 手册中是否指出了这一点?http://grails.org/doc/latest/guide/single.html#transactionsRollbackAndTheSession (2认同)