我在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的时候数据就又丢失了,请问这样的问题该怎么解决,这种情况只有个别类会遇到,完全一样的写法有些类就没问题