簡體   English   中英

Hibernate @BatchSize和JPA Criteria API

[英]Hibernate @BatchSize and JPA Criteria API

這兩個之間不兼容嗎?

我有一個n + 1問題,我嘗試使用專有的hibernate @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中未批量加載詳細信息集合。

Env:Wildfly 8.2.0.Final with Hibernate 4.3.7

在此鏈接上,有一些有關批量獲取mkyong的信息

要解決此問題,可以使用fetch

我認為了解差異的關鍵在於查看每次加載數據的方式。 根據標准,將加載一組Master,但使用em.find(class,id),則每次只能檢索一個。 我不確定這是否是原因,但也許有人可以帶來更多啟示。

我發現了問題。 我將CDI與綁定到請求范圍的實體管理器一起使用。 問題在於,在ejb上聲明了方法getMastersFromJPACriteria,並且在事務提交時刷新了我的實體管理器。 似乎HibernateBatch Collection Queue在會話刷新時已清除,即使在方法調用后我的主實體仍處於MANAGED狀態! 本期中對此進行了解釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM