我有Spring和延迟加载的下一个问题。我有下一个服务方法:
@Override
@Transactional(readOnly=true)
public List<A> getA(Long ano, Long idGt) {
List<A> datos = ADAO.getHorariosAnoGt(ano, idGt);
datos.size();
C c = datos.get(0).getB().getC();
return datos;
}
接下来的实体:
A:
B b; *(LAZY)*
Y y;
B:
C c; *(LAZY)*
X x;
C:
H h;
很好,当我这样做时,我没有加载b和c的数据,但“datos.get(0).getB()。getC();”返回数据。
答案 0 :(得分:2)
您可以使用一些选项
fetchType=FetchType.EAGER
Hibernate.initialize(..)
for (A dato : datos) {
dato.getB().getC();
}
答案 1 :(得分:1)
我想我现在有你了。所以从getA()
方法之外你无法访问B和C但是希望能够,对吧?
这是@Transactional
注释的原因,这意味着一旦方法完成,事务(更重要的是会话)就会关闭 - 所以在方法内部(因此在同一个会话中)可以访问延迟加载关联(你的B和C),但在方法之外是不可能的。
要提供B和C,您可以按照@JohanSjöberg的任何选项进行操作。 (如果您不想永久更改提取类型选项2可能是最好的)或者在ADAO.getHorariosAnoGt(ano, idGt)
方法中,您可以动态更改使用的提取模式:
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html#querycriteria-dynamicfetching
即。 criteria.setFetchMode("b", FetchMode.EAGER)