【发布时间】:2013-04-03 13:27:38
【问题描述】:
我有一个结构如下的方法:
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) 添加到代码中,但没有用。我在这里做错了什么?
更新:我尝试在检查属性之前调用it.attach 方法,但在方法调用之后it.attached 的值是false。
【问题讨论】:
-
你是在视图中调用这个方法吗?
-
@SérgioMichels,不,此方法由调度程序调用。一个任务被添加到调用
run()方法的调度程序中。
标签: hibernate grails grails-orm