2

我遇到了 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,而是“datos.get(0).getB().getC();” 返回数据。

4

2 回答 2

2

您可以使用一些选项

  • 对特定数据类型使用预先加载,例如,fetchType=FetchType.EAGER
  • 手动初始化集合Hibernate.initialize(..)
  • 使用Fetch Profiles来切换延迟加载和急切加载
  • 访问事务中惰性集合的对象(类似于您所做的),例如,
for (A dato : datos) {
    dato.getB().getC();
}
于 2012-08-07T08:16:20.560 回答
1

啊,我想我现在已经得到你了。因此,从getA()方法外部您无法访问 Bs 和 Cs,但希望能够访问,对吗?

原因是@Transactional注释,这意味着一旦方法完成,事务(更重要的是会话)就会关闭 - 因此在方法内部(因此在同一个会话中)可以访问延迟加载的关联(你的 Bs 和 Cs ) 但在方法之外是不可能的。

要使 Bs 和 Cs 可用,您可以遵循 @Johan Sjöberg 的任何选项。(如果您不想永久更改获取类型选项 2 可能是最好的)或者在该ADAO.getHorariosAnoGt(ano, idGt)方法中您可以动态更改使用的获取模式: http: //docs.jboss.org/hibernate/orm/3.3/reference /en/html/querycriteria.html#querycriteria-dynamicfetching

IEcriteria.setFetchMode("b", FetchMode.EAGER)

于 2012-08-07T09:03:48.200 回答