【问题标题】:JPA Hibernate, Lazy loading after a JoinJPA Hibernate,加入后延迟加载
【发布时间】:2019-04-28 04:37:09
【问题描述】:

我需要从 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);

所以文件夹应该填充标签集合并避免延迟加载部分。

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

休眠:选择文件夹0_.id 作为 id2_2_... 休眠:选择 tags0_.files_id ...

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

【问题讨论】:

  • 指定一个提取连接:docs.oracle.com/html/E13946_01/…
  • 谢谢你下次我会 RTFM
  • @AlanHay 和 Kaizokun:我阅读了链接的独库,但我无法理解 oracles 示例中的用例
  • @JimHawkins:你不明白什么?
  • 我在 oracles 示例中读到的内容是这样的:查询返回 5 个对 id 为 1 的杂志的引用。为什么这有用?

标签: hibernate jpa spring-data-jpa


【解决方案1】:

感谢艾伦·海。解决方案很简单,我们只需要使用 Fetch 关键字。为了填充集合。

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

【讨论】:

    猜你喜欢
    • 2016-12-21
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 2013-10-03
    相关资源
    最近更新 更多