poster214 2010-03-24 10:38
浏览 363
已采纳

hibernate 延迟加载异常(无法获取lazy对象)

我在jpa中有两个对象:hospitalization与patient,两个对象之间是多对一双向关联,全部都加上lazy
然后在查询的时候使用left join fetch 来加载patient
service如下:
[code="java"]

    try{

        String sql="select h from Hospitalization as h left join fetch h.patient where h.code=?1";
        Query query=entityManager.createQuery(sql);
        query.setParameter(1, code);
        return (Hospitalization) query.getSingleResult();
    }catch(Exception e){
        e.printStackTrace();
        return null;
    }

[/code]
这样返回的hospitalization这个对象无法获取patient这个属性,报no session异常:
[code="java"]
2010-03-24 10:40:22,343 [main] ERROR org.hibernate.LazyInitializationException:19 - could not initialize proxy - no Session
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:166)
[/code]
如果我在service上面用
[code="java"]
Hospitalization h=(Hospitalization) query.getSingleResult();
// System.out.println(h.getPatient().getPatientName());
return h;
[/code]
这样来写可以get到,但是这样hibernate又从数据库查询了一次,明明在调用left join fetch 这个sql的时候已经搜索出来了patient值(在sqlserver上面执行可以看到)但是他却不会组装成对象关联,返回给client的时候数据就又丢失了,请问这样的问题该怎么解决,这种情况只有个别类会遇到,完全一样的写法有些类就没问题

  • 写回答

18条回答 默认 最新

  • hujunfei 2010-03-27 16:33
    关注

    select h.xx,p.xx from Hospitalization as h left join fetch h.patient p where h.code=?1
    p.xx是patient对象的属性值

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(17条)

报告相同问题?

悬赏问题

  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler