@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
查询。
我不知道这是怎么发生的。
任何帮助将不胜感激。
答案 0 :(得分:-1)
这是因为Hibernate没有其他方法可以知道是否要为此变量分配null还是Proxy。您看到的可能是代理对象。
使用 <meta name="_csrf" content="${_csrf.token}"/>
<meta name="_csrf_header" content="${_csrf.headerName}"/>
并尝试。此可选技巧不适用于每个Hibernate。