【问题标题】:LazyLoading with ManyToMany worked as EAGER使用 ManyToMany 进行延迟加载作为 EAGER
【发布时间】:2020-01-29 10:44:38
【问题描述】:

我在 Film 和 Actor 表之间存在多对多的关系

@Table(...)
public class Film extends SuperId {
...
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinTable(name = "films_actors",
            joinColumns = @JoinColumn(name="film_id", referencedColumnName="id"),
            inverseJoinColumns = @JoinColumn(name="actor_id", referencedColumnName="id"))
    private Set<Actor> actors = new HashSet<>();
...
}

和Actor的实体

@Table
public class Actor extends SuperId {
...
    @ManyToMany(mappedBy = "actors", fetch = FetchType.LAZY)
    @JsonIgnore
    private Set<Film> films = new HashSet<>();
...
}

但是当我尝试使用 SpringData 方法或基于 Criteria 构建器的方法检索所有电影时,我得到所有电影,并初始化了所有相关的 Actors 和其他惰性相关实体

@PersistenceContext
private EntityManager em;

public List<Film> findAllLazy(Pageable pageable) {
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Film> query = cb.createQuery(Film.class);
    Root<Film> root = query.from(Film.class);
    query.select(root)
            .distinct(true)
            .orderBy(cb.asc(root.get(Film_.rating)));
    return em.createQuery(query)
            .setFirstResult((pageable.getPageNumber()) * pageable.getPageSize())
            .setMaxResults(pageable.getPageSize())
            .getResultList();
}

【问题讨论】:

  • Hibernate 执行的 SQL 看起来如何?
  • @SimonMartinelli select distinct ... from films order ... 但是当我尝试查看集合中包含的内容时,我会检索所有相关实体
  • '我尝试查看集合中包含的内容'你是如何以及在哪里这样做的?

标签: hibernate spring-boot many-to-many lazy-loading


【解决方案1】:

访问 Debugger 中设置的 Actor 将触发延迟加载集合的加载。

因此延迟加载按预期工作。

【讨论】:

    猜你喜欢
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 2011-01-09
    • 2017-07-08
    • 2019-01-19
    • 1970-01-01
    • 2013-04-11
    相关资源
    最近更新 更多