Spring:不要在延迟模式下加载,而是获取数据

时间:2012-08-07 08:06:34

标签: java spring hibernate lazy-loading

我有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();”返回数据。

2 个答案:

答案 0 :(得分:2)

您可以使用一些选项

  • 对特定数据类型使用预先加载,例如fetchType=FetchType.EAGER
  • 手动初始化集合Hibernate.initialize(..)
  • 使用Fetch Profiles来切换懒惰与急切加载
  • 访问您的懒人集合里面交易的对象(类似于您所做的),例如,
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)