停止Spring MVC获取LazyLoad数据

时间:2018-07-10 13:09:01

标签: java spring-mvc spring-boot spring-data-jpa

使用带有两个实体的SpringBoot 1.5.15.BUILD-SNAPSHOTdata-jpa创建一个简单的spring boot项目。

父实体

spring-mvc(web)

子实体

@Entity
public class Parent {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "parent_id")
    private Collection<Child> children;

    //Getter & Setter remove for brevity
}

每当调用用于提取所有@Entity public class Child { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id") private Integer id; @Column(name = "name") private String name; } 数据的端点时,也会返回子数据,但是据我的理解,默认情况下fetchType为LazyLoading。

以下用于获取数据的Spring Mvc剩余代码

Parent

只有延迟@RestController @RequestMapping("test") public class Controller { @Autowired ParentRepository parentRepository; @RequestMapping(produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.GET) public ResponseEntity<Collection<Parent>> findAll(HttpServletRequest request) { List<Parent> parents = parentRepository.findAll(); return new ResponseEntity<>(parents, HttpStatus.OK); } } 数据而不是带有子数据收集的数据应该被延迟加载,这样才应该发生并且应该发生。

我该如何阻止这种总是渴望加载孩子的不良行为。

N.B:我尝试将Parent设置为LazyLoad,尽管当我调用'/ test'时,也会获取子数据

1 个答案:

答案 0 :(得分:0)

最后,我设法阻止Jackson为我拉动延迟加载的数据。

要做到这一点 添加以下Maven依赖项

  <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-hibernate5</artifactId>
        <version>2.9.6</version>
  </dependency>

然后像这样子类ObjectMapper并根据您使用的休眠版本注册休眠模块。我正在使用休眠5,所以我这样做了

public class HibernateAwareObjectMapper extends ObjectMapper {

    public HibernateAwareObjectMapper() {
        registerModule(new Hibernate5Module());
    }
}

最后添加一个Bean

@Bean
public ObjectMapper objectMapper(){
    return new HibernateAwareObjectMapper();
}

使用上面的代码,延迟加载的属性不会自动初始化。