我有一个具有以下结构的方法:
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
。
答案 0 :(得分:19)
我认为你没有做任何'错误',只是该对象与hibernate会话分离。我尝试了几件事:
答案 1 :(得分:0)
当我将子域类用于一个类时,我有同样的错误,如果您的数据大小超过页面大小,您将收到错误“消息:无法初始化代理 - 没有会话”
使用<> lazy:false,hibernate将正确使用会话附件,并显示相应的数据。
谢谢你的这篇文章。我能够解决我的错误。
答案 2 :(得分:0)
Thomas Farvour指出了正确的方向。文档,13.1.1事务回滚和会话,建议将孩子们作为最佳解决方案。