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

hfsqlsce  于 2023-03-19  发布在  Go
关注(0)|答案(3)|浏览(162)

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

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

cnjp1d6j

cnjp1d6j1#

我不认为你做错了什么,只是对象从休眠会话中分离了。我会尝试以下几件事:

  • 调用方法attach()将对象附加回休眠会话
  • 在两个域类non-lazy之间建立关联
bf1o4zei

bf1o4zei2#

托马斯Farvour指出了正确的方向,文档13.1.1 Transactions Rollback and the Session建议将急于获取孩子作为最佳解决方案。

zc0qhyus

zc0qhyus3#

当我使用子域类作为一个类时,我也遇到了同样的错误,如果数据大小超过页面大小,就会得到错误"Message: could not initialize proxy - no Session"
通过使用lazy:false,hib将正确地使用会话附件,并显示适当的数据。

相关问题