Hibernate 和许多人一起懒散地工作,他们也一样热心

Hibernate 和许多人一起懒散地工作,他们也一样热心,hibernate,spring-boot,many-to-many,lazy-loading,Hibernate,Spring Boot,Many To Many,Lazy Loading,我在电影和演员表之间有很多联系 @Table(...) public class Film extends SuperId { ... @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinTable(name = "films_actors", joinColumns = @JoinColumn(name="film_id", referencedColumnName="i

我在电影和演员表之间有很多联系

@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<>();
...
}
@表(…)
公共级电影{
...
@ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
@JoinTable(name=“films\u actors”,
joinColumns=@JoinColumn(name=“film_id”,referencedColumnName=“id”),
inverseJoinColumns=@JoinColumn(name=“actor\u id”,referencedColumnName=“id”))
私有集actors=newhashset();
...
}
和演员的实体

@Table
public class Actor extends SuperId {
...
    @ManyToMany(mappedBy = "actors", fetch = FetchType.LAZY)
    @JsonIgnore
    private Set<Film> films = new HashSet<>();
...
}
@表格
公共类演员{
...
@ManyToMany(mappedBy=“actors”,fetch=FetchType.LAZY)
@杰索尼奥雷
私有集=新的HashSet();
...
}
但是,当我尝试使用SpringData方法或基于Criteria builder的方法检索所有影片时,我得到了所有具有初始化的所有相关演员和其他惰性相关实体的影片

@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();
}
@PersistenceContext
私人实体管理者;
公共列表FindAllazy(可分页){
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery=cb.createQuery(Film.class);
Root=query.from(Film.class);
查询。选择(根)
.distinct(正确)
.orderBy(cb.asc(root.get(Film.rating));
返回em.createQuery(查询)
.setFirstResult((pageable.getPageNumber())*pageable.getPageSize())
.setMaxResults(pageable.getPageSize())
.getResultList();
}

访问调试器中设置的参与者将触发延迟加载集合的加载


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

访问调试器中设置的参与者将触发延迟加载集合的加载


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

Hibernate执行的SQL看起来如何?@SimonMartinelli
选择distinct。。。从电影顺序…
但当我尝试查看集合中包含的内容时,我会检索所有相关实体“我尝试查看集合中包含的内容”您是如何以及在哪里执行的?Hibernate执行的SQL看起来如何?@SimonMartinelli
选择distinct。。。从电影顺序…
但当我试图查看集合中包含的内容时,我会检索所有相关实体“我试图查看集合中包含的内容”您究竟是如何以及在何处这样做的?