Java Spring数据REST-延迟加载收集失败

Java Spring数据REST-延迟加载收集失败,java,rest,spring-mvc,hateoas,spring-data-rest,Java,Rest,Spring Mvc,Hateoas,Spring Data Rest,我刚刚开始在SpringMVC应用程序中使用SpringDataREST,以减少将REST作为API支持所需的工作 对于顶级实体来说,这几乎可以立即生效——我们可以返回所有项目,放置/发布新项目,或者按ID返回特定项目 我现在遇到的问题是,在尝试跟随提供的链接以显示映射到我返回的实体的集合时 我抛出了一个“org.hibernate.LazyInitializationException:no Session”——我猜想它将父对象遍历到集合中(该集合是延迟加载的) 在谷歌上搜索这个问题意味着启用

我刚刚开始在SpringMVC应用程序中使用SpringDataREST,以减少将REST作为API支持所需的工作

对于顶级实体来说,这几乎可以立即生效——我们可以返回所有项目,放置/发布新项目,或者按ID返回特定项目

我现在遇到的问题是,在尝试跟随提供的链接以显示映射到我返回的实体的集合时

我抛出了一个“org.hibernate.LazyInitializationException:no Session”——我猜想它将父对象遍历到集合中(该集合是延迟加载的)

在谷歌上搜索这个问题意味着启用OpenEntityManagerViewFilter——但是我们不愿意在我们的项目中启用它,因为我们以前有过导致数据库连接死锁的糟糕经历

任何人都可以提供一个提示,说明我可能缺少一个配置选项,或者我在文档中缺少的一些东西,比如让这些链接在集合中正确导航

问候,


Andy

您可以通过配置(例如,使用JPA注释)强制执行即时加载:

或者,您可以使用HQL的
joinfetch

select x from X left join fetch x.y y

我在这里提交了JIRA问题:


您可以投票支持它。

对于基于Java的配置,请根据您的hibernate版本添加以下依赖项

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hibernate4</artifactId>
</dependency>

com.fasterxml.jackson.datatype
jackson-datatype-hibernate4
添加以下配置

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter{

    public MappingJackson2HttpMessageConverter jacksonMessageConverter(){
        MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();

        ObjectMapper mapper = new ObjectMapper();
        //Registering Hibernate4Module to support lazy objects
        mapper.registerModule(new Hibernate4Module());

        messageConverter.setObjectMapper(mapper);
        return messageConverter;

    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        //Here we add our custom-configured HttpMessageConverter
        converters.add(jacksonMessageConverter());
        super.configureMessageConverters(converters);
    }
}
@配置
@EnableWebMvc
公共类WebConfig扩展了WebMVCConfigureAdapter{
公共映射Jackson2HttpMessageConverter jacksonMessageConverter(){
MappingJackson2HttpMessageConverter messageConverter=新的MappingJackson2HttpMessageConverter();
ObjectMapper mapper=新的ObjectMapper();
//注册Hibernate4Module以支持惰性对象
registerModule(新的Hibernate4Module());
messageConverter.setObjectMapper(映射器);
返回消息转换器;
}
@凌驾

public void configureMessageConverters(列表)将集合设置为“急切加载”有点违背了链接到集合的目的-当我们对类a执行GET(findAll)时,我们不希望返回类B的所有集合(即使它并没有在响应中返回),因为如果我们对顶级对象进行FindAll,我们将有效地返回整个数据库对象图。谢谢!这似乎是我遇到的同一个问题-我投了赞成票。希望它尽快得到修复。它似乎在2.0快照中工作(尚未发布)。您可以尝试一下。
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter{

    public MappingJackson2HttpMessageConverter jacksonMessageConverter(){
        MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();

        ObjectMapper mapper = new ObjectMapper();
        //Registering Hibernate4Module to support lazy objects
        mapper.registerModule(new Hibernate4Module());

        messageConverter.setObjectMapper(mapper);
        return messageConverter;

    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        //Here we add our custom-configured HttpMessageConverter
        converters.add(jacksonMessageConverter());
        super.configureMessageConverters(converters);
    }
}