启用FetchType.LAZY时,仍会加载引用的对象

时间:2019-01-23 21:02:41

标签: hibernate spring-data-jpa

@Data
@EqualsAndHashCode(exclude = {"suburbs", "upCities"})
class City {

    @ManyToMany(mappedBy = "suburbs", fetch = FetchType.LAZY)
    @JsonBackReference
    private Set<City> uppers = new HashSet<>();

    @ManyToMany(cascade = {
            CascadeType.PERSIST,
            CascadeType.MERGE
    }, fetch = FetchType.LAZY)
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    @BatchSize(size = 5)
    @JsonManagedReference
    private Set<City> suburbs = new HashSet<>();

    @Override
    public int compareTo(City o) {
        return publicId.compareTo(o.getId());
    }
}

class CityService {
  public List<City> findAll() {
        return dao.findAll().stream().sorted().collect(Collectors.toList());
    }

即使我设置了延迟提取,findAll方法仍然会加载所有引用的实体(郊区和上层)。

在休眠日志中,有一个select suburbs查询,但没有select uppers查询。

我不知道这是怎么发生的。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:-1)

这是因为Hibernate没有其他方法可以知道是否要为此变量分配null还是Proxy。您看到的可能是代理对象。

使用 <meta name="_csrf" content="${_csrf.token}"/> <meta name="_csrf_header" content="${_csrf.headerName}"/> 并尝试。此可选技巧不适用于每个Hibernate。