gpt4 book ai didi

java - 为什么加载惰性集合

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:07:40 24 4
gpt4 key购买 nike

我有一个 Project 实体,它与 Event 实体具有 oneToMany 关系

public class Project {
....

@OneToMany(mappedBy = "dossier", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private List<Event> events;

}

我有一个 ProjectService 类

@Service
@Transactional
public class ProjectService {

public List<Project> findAll() {
return (List<Project>) projectRepository.findAll();
}
}

还有一个项目 Controller

@RestController
@RequestMapping(value = "/projects")
public class ProjectController {

@RequestMapping(method= RequestMethod.GET)
public List<Project> getAllProject() {
return projectService.findAll();
}
}

在我的客户端代码中,我看到项目的事件已加载,但我不明白为什么。

我预计在 DossierService 中的 findAll 方法的事务结束时,实体将被分离。显然,在我的 Controller 中的 jackson 序列化期间检索事件时,我的实体仍然附加。

最佳答案

Project.events 默认情况下是延迟加载的,因为它是一个 OneToMany 关系。

这并不意味着 Project.events 没有加载。这意味着它将在调用 Project.getEvents() 时立即加载。

这发生在 JSON 序列化时(当 ProjectController.getAllProject() 返回其响应时)。

为了防止这种情况,有两种方法:

  • 您对 ProjectService 返回的每个项目显式调用 project.setEvents(null)(或一个空列表)。
  • 或者您在 Project.events 上添加一个 @JsonIgnore 注释。

编辑:如果您使用的是 spring-boot,一个 OpenEntityManagerInViewInterceptor默认注册:

Spring web request interceptor that binds a JPA EntityManager to the thread for the entire processing of the request. Intended for the "Open EntityManager in View" pattern, i.e. to allow for lazy loading in web views despite the original transactions already being completed.

您可以通过将此行添加到 application.properties 来禁用此行为:

spring.jpa.open-in-view=false

使用此配置,在 hibernate session 之外调用 getter 将导致 LazyInitializationException

关于java - 为什么加载惰性集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35914540/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com