Hibernate @BatchSize 和 JPA 标准 API
Hibernate @BatchSize and JPA Criteria API
这两个之间是否不兼容?
我有一个 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
在这个 link 上有一些关于批量获取的信息 mkyong。
要解决此问题,您可以使用 fetch。
我认为了解差异的关键是查看每次加载数据的方式。根据标准,加载了一组大师,但
em.find(class,id),每次只取一个。我不确定这是否是原因,但也许有人可以带来更多启示。
我找到问题了。我将 CDI 与绑定到请求范围的实体管理器一起使用。问题是方法 getMastersFromJPACriteria 是在 ejb 上声明的,并且我的实体管理器在事务提交时被刷新。看来 Batch Collection Queue from Hibernate are cleared on session flush even though my master entities are still in a MANAGED state after the method call! It is explained in this .
这两个之间是否不兼容?
我有一个 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
在这个 link 上有一些关于批量获取的信息 mkyong。
要解决此问题,您可以使用 fetch。
我认为了解差异的关键是查看每次加载数据的方式。根据标准,加载了一组大师,但 em.find(class,id),每次只取一个。我不确定这是否是原因,但也许有人可以带来更多启示。
我找到问题了。我将 CDI 与绑定到请求范围的实体管理器一起使用。问题是方法 getMastersFromJPACriteria 是在 ejb 上声明的,并且我的实体管理器在事务提交时被刷新。看来 Batch Collection Queue from Hibernate are cleared on session flush even though my master entities are still in a MANAGED state after the method call! It is explained in this