我有一个简单的“区域”表,它与通过连接表建模的关系。区域可以是几个超区域的一部分,也可以包含许多子区域。我的地区类包含对其超区域及其子区域的引用。两组都可能是空的。总共我有几千个条目,随着时间的推移它们不会有太大变化。我的问题是通过hibernate HQL将整个表有效加载到内存中。到目前为止,尽管我指定了延迟加载,但hibernate尝试创建查询以获取每个区域的超级区域。我想我忽略了一些配置或参数。
班级
width 100%
我尝试通过HQL加载所有区域的代码:
@Entity
@Table(name = "region", catalog = "things")
public class Region extends Thing{
private Set<Region> subRegions = new HashSet<>();
private Set<Region> superRegions = new HashSet<>();
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name="region_region",
joinColumns={@JoinColumn(name="parent_id")},
inverseJoinColumns={@JoinColumn(name="child_id")}
)
public Set<Region> getSubRegions(){
return this.subRegions;
};
public void setSubRegions(Set<Region> subRegions) {
this.subRegions = subRegions;
}
@ManyToMany(mappedBy="subRegions")
public Set<Region> getSuperRegions(){
return this.superRegions;
}
public void setSuperRegions(Set<Region> superRegions) {
this.superRegions = superRegions;
}
为什么这会导致如此多的查询(我怀疑是N + 1,虽然我没有计算),不仅仅是一个?
我需要做什么,快速将表格加载到内存中。显然,单个数据库查询就足够了。