hibernate - JPA Hibernate,加入后延迟加载
问题描述
我需要从 Rest 控制器获取一个实体及其集合,但我对 spring data JPA 有一个非常奇怪的行为。
我与延迟加载的实体之间存在多对多关系。
@Entity
class Folder{
...
@ManyToMany(fetch = FetchType.LAZY)
protected Set<Tag> tags;
...getter setter
}
@Entity class Tag{
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "tags"
protected List<File> files;
}
以及 spring jpa 存储库中的 JPQL 查询
@Query("SELECT f FROM Folder f INNER JOIN f.tags t WHERE
f.id = :id")
Folder findFolderById(@Param("id") int id);
所以文件夹应该填充标签集合并避免延迟加载部分。
但是我可以在日志中看到,在加入查询之后,标签表上有一个选择,所以是延迟加载。
休眠:选择文件夹 0_.id 作为 id2_2_... 休眠:选择 tags0_.files_id ...
我不想使用获取类型 EAGER,因为我并不总是需要 Tag 集合。如何避免延迟加载?
解决方案
感谢艾伦·海。解决方案很简单,我们只需要使用 Fetch 关键字。为了填充集合。
@Query("SELECT f FROM Folder f LEFT JOIN FETCH f.tags t WHERE
f.id = :id")
Folder findFolderById(@Param("id") int id);