欢迎进入Wiki » FAQ » 异常处理:org.hibernate.LazyInitializationException: could not initialize proxy - no Session?

异常处理:org.hibernate.LazyInitializationException: could not initialize proxy - no Session?

在2014-01-16 08:50上被李小翔修改
评论 (0) · 附件 (0) · 记录 · 信息

当访问一个领域实体对象的关联对象属性时抛出异常:

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

这种异常多发生在计划任务、多线程(Thread.start、runAsync...)、或者 transactional 为 false 的服务类等处中,如:

Foo foo = Foo.get(1);
// 这里 bar 是关联属性,执行到这里时抛出异常
Bar bar = foo.bar;

既然异常已经很明显的说了 no Session,所以一般情况下,直接将整个代码块包在一个 Xxx.withNewSession 中即可,如:

Class FoobarJob {
   def execute() {
        Foo.withNewSession{
            Foo foo = Foo.get(1);
            Bar bar = foo.bar;
           ......
       }
   }
}

或者,某些情况下处于性能考虑不希望添加 withNewSession,可以用动态查询或者HQL的方式来获得关联属性,如:

Foo foo = Foo.get(1)
// 用 Domain 的 get 方法来获得属性对象
Bar bar = Bar.get( foo.barId );

此外,类似的异常“No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here”也可以尝试使用 withNewSession 来处理。

标签: grails
在2014-01-08 09:30上被李小翔创建

Copyright © 2013 北京博瑞开源软件有限公司
京ICP备12048974号