【发布时间】: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