Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 弹簧:Don´;t在惰性模式下加载,但获取数据_Java_Spring_Hibernate_Lazy Loading - Fatal编程技术网

Java 弹簧:Don´;t在惰性模式下加载,但获取数据

Java 弹簧:Don´;t在惰性模式下加载,但获取数据,java,spring,hibernate,lazy-loading,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

下一个问题是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;
}

很好,当我这样做时,我没有得到加载了b和c的DATO,而是“datos.get(0).getB().getC();”返回数据。

您可以使用一些选项

  • 对特定数据类型使用即时加载,例如,
    fetchType=fetchType.eager
  • 手动初始化集合
    Hibernate.initialize(..)
  • 用于切换惰性加载与急切加载
  • 访问事务中惰性集合的对象(与您所做的类似),例如

啊,我想我抓住你了。因此,从
getA()
方法之外,您无法访问Bs和Cs,但希望能够访问,对吗

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

要使Bs和Cs可用,您可以遵循@Johan Sjöberg的任何选项。(如果您不想永久更改提取类型,那么选项2可能是最好的)或者在
ADAO.getHorariosAnoGt(ano,idGt)
方法中,您可以动态更改使用的提取模式:


i、 e.
criteria.setFetchMode(“b”,FetchMode.EAGER)

这与SpringMVC无关。SpringMVC是前端框架,您询问的是服务/持久性层,这意味着合适的标记是spring和/或SpringORM。还有:你用什么ORM?冬眠?JPA?@Sean Patrick Floyd我正在使用Hibernate。我不确定我是否理解你的问题-你是说
datos.get(0.getB().getC()
正在引发异常,或者它正常工作,但您希望它引发异常?@DB5抱歉,我的英语不好。它可以工作并返回值,但这些值不会加载到DATO中。我希望在datos中加载值。因此,
datos.get(0).getB().getC()
在例程内部填充,但是如果在例程外部执行
datos.get(0).getB().getC()
,则会出现异常或null?迭代集合中的所有值在该方法中不起作用,为什么会出现这种情况?
A:
 B b; *(LAZY)*
 Y y;
B:
 C c; *(LAZY)*
 X x;
C:
 H h;
for (A dato : datos) {
    dato.getB().getC();
}