我有一个具有以下结构的方法:
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条答案
按热度按时间cnjp1d6j1#
我不认为你做错了什么,只是对象从休眠会话中分离了。我会尝试以下几件事:
attach()
将对象附加回休眠会话bf1o4zei2#
托马斯Farvour指出了正确的方向,文档13.1.1 Transactions Rollback and the Session建议将急于获取孩子作为最佳解决方案。
zc0qhyus3#
当我使用子域类作为一个类时,我也遇到了同样的错误,如果数据大小超过页面大小,就会得到错误
"Message: could not initialize proxy - no Session"
通过使用
lazy:false
,hib将正确地使用会话附件,并显示适当的数据。