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

时间:2013-04-11 11:13:33

标签: hibernate grails gorm

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

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) 
                }
            }
        }
    }
}

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

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

upd:我尝试在检查属性之前调用it.attach方法,但在方法调用之后,it.attached的值为false

3 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:0)

当我将子域类用于一个类时,我有同样的错误,如果您的数据大小超过页面大小,您将收到错误“消息:无法初始化代理 - 没有会话”

使用<> lazy:false,hibernate将正确使用会话附件,并显示相应的数据。

谢谢你的这篇文章。我能够解决我的错误。

答案 2 :(得分:0)

Thomas Farvour指出了正确的方向。文档,13.1.1事务回滚和会话,建议将孩子们作为最佳解决方案。