gpt4 book ai didi

java - JpaRepository 查找左连接无限循环

转载 作者:行者123 更新时间:2023-12-02 09:49:03 27 4
gpt4 key购买 nike

我正在努力尝试创建一种方法来从数据库获取对象并加载依赖项。

在正常情况下,我永远不想加载它,所以我的两个对象看起来像这样:

public class Training implements Serializable {

[...]

// Default => LAZY
@OneToMany(mappedBy = "training")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
private Set<Video> videoLists = new HashSet<>();

[...]
}

public class Video implements Serializable {

[...]

// Default => EAGER
@ManyToOne(optional = false)
@NotNull
@JsonIgnoreProperties("videos")
private Training training;

[...]
}

为了实现某个目标,我需要以急切模式加载我的训练,因此我创建了此功能:

@Repository
public interface TrainingRepository extends JpaRepository<Training, Long> {

@Query("from Training t left join fetch t.videoLists")
List<Training> findEager();

}

由于这种循环获取,此代码会产生 StackOverflow 错误。在使此功能正常工作的同时保持 EAGER/LAZY 获取的最佳方法是什么?

最佳答案

一般来说,不建议将集合与每条记录一起加载。在您的情况下,假设每次训练都有 100 个或更多视频,因此您将在每次训练时加载 100 个或更多视频。此外,您的关系中没有任何分页机制,因此您在每次训练时加载所有视频。它可能是您的应用程序中的瓶颈。我认为你应该改变你的设计来克服这个问题,而不是改变急切/惰性配置。例如,您可以仅加载不带视频的培训,并且在您的 UI 中,当用户单击培训时,会加载其视频。

但是,如果您想让该查询在不进行任何更改的情况下工作,我认为在 ManyToOne 中使用 fetch = FetchType.LAZY 可能可以解决您的 stackoverflow 问题。

关于java - JpaRepository 查找左连接无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56453138/

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