我正在努力寻找一种方法来从数据库中获取对象并加载依赖项。
通常情况下,我永远不想加载它,因此我的两个对象看起来像这样:
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的最佳方法是什么?
答案 0 :(得分:1)
通常,不建议在每条记录旁边加载一个集合。在您的情况下,假设每个培训都有100个或更多的视频,那么您将在每次培训的同时加载100个或更多的视频。另外,您的关系中没有任何分页机制,因此每次培训都加载所有视频。它可能是您应用程序中的瓶颈。我认为您应该更改设计以克服此问题,而不是更改急切/懒惰的配置。例如,您可以只加载没有视频的培训,然后在用户界面中,当用户单击培训时,可以加载培训的视频。
但是,如果您希望不加任何更改地运行该查询,我认为可能在fetch = FetchType.LAZY
中使用ManyToOne
可以解决您的stackoverflow问题。