【发布时间】:2016-03-21 17:13:21
【问题描述】:
这两者之间有不兼容的地方吗?
我有一个n + 1 问题,我尝试使用专有的休眠@BatchSize 注释来解决。
public class Master{
@OneToMany(fetch = FetchType.LAZY, mappedBy = "master", orphanRemoval = true, cascade = CascadeType.ALL)
@BatchSize(size=100)//how many item collections we want to load from <b>other<b> Masters currently in the PC
private Set<Detail> details;
}
public class Detail{
private Master master;
}
案例 1
List<Master> masters = getMastersFromJPACriteria(complexParams);
assert(masters.size() == 3);
masters.get(0).getDetails().size();
它应该会触发细节的批量收集加载:
SELECT * FROM DETAIL WHERE MASTER_ID IN (1,2,3)
但我有(N+1 个问题):
SELECT * FROM DETAIL WHERE MASTER_ID = 1
案例2
但是,如果我这样做:
m1 = entityManager.find(Master.class,1L);
entityManager.find(Master.class,2L);
entityManager.find(Master.class,3L);
m1.getDetails().size();
它正确触发:
SELECT * FROM DETAIL WHERE MASTER_ID IN (1,2,3)
我不明白为什么在案例 1 中没有批量加载详细信息集合。
环境:Wildfly 8.2.0.Final 和 Hibernate 4.3.7
【问题讨论】:
标签: java hibernate jpa wildfly