JPA Hibernate,加入后延迟加载

时间:2018-11-26 13:58:15

标签: hibernate jpa spring-data-jpa

我需要从Rest控制器获取一个实体及其集合,但是对于Spring数据JPA,我有一个非常奇怪的行为。

我与延迟加载的实体之间存在ManyToMany关系。

@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);

因此,应该使用Tag集合填充Folder,并避免延迟加载部分。

但是我可以在日志中看到加入查询之后 标记表上有一个选择,因此延迟加载。

休眠:选择文件夹0_.id作为ID2_2 _... 休眠:选择标签0_.files_id ...

我不想使用访存类型EAGER,因为我并不总是需要Tag集合。如何避免这种延迟加载?

1 个答案:

答案 0 :(得分:0)

感谢Alan Hay。解决方案很简单,我们只需要使用Fetch关键字即可。为了填充集合。

@Query("SELECT f FROM Folder f LEFT JOIN FETCH f.tags t WHERE
        f.id = :id")
Folder findFolderById(@Param("id") int id);