带有左连接无限循环的JpaRepository查找

时间:2019-06-05 01:14:46

标签: java hibernate jpa spring-data-jpa

我正在努力寻找一种方法来从数据库中获取对象并加载依赖项。

通常情况下,我永远不想加载它,因此我的两个对象看起来像这样:

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的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

通常,不建议在每条记录旁边加载一个集合。在您的情况下,假设每个培训都有100个或更多的视频,那么您将在每次培训的同时加载100个或更多的视频。另外,您的关系中没有任何分页机制,因此每次培训都加载所有视频。它可能是您应用程序中的瓶颈。我认为您应该更改设计以克服此问题,而不是更改急切/懒惰的配置。例如,您可以只加载没有视频的培训,然后在用户界面中,当用户单击培训时,可以加载培训的视频。

但是,如果您希望不加任何更改地运行该查询,我认为可能在fetch = FetchType.LAZY中使用ManyToOne可以解决您的stackoverflow问题。