[英]Hibernate Session.multiLoad L2 cache issue
我正在使用Hibernate 5.2.6和配置的L2緩存(通過jhache / ehcache)。 我想通過id加載多個實體
session.byMultipleIds(User.class).multiLoad(ids)
看到第一個電話后
select user0_.id as id1_20_0_ ... from user_data user0_ where user0_.id in (?,...,?)
在日志中,用戶實體被放置到L2緩存中。
第二個調用在日志中觸發相同的SQL語句,而不是從L2緩存中檢索實體。
使用L1緩存時,不會發生此問題(使用enableSessionCheck(true)
)。
這是預期的行為還是我錯誤配置了什么?
我用輔助類來解決它:
public class HibernateUtils {
static <T> List<T> byMultipleIds(Session session, Long[] ids, Class<T> entityClass) {
List<Long> notCached = new ArrayList<>();
for (Long id : ids) {
if (!session.getSessionFactory().getCache().contains(entityClass, id)) {
notCached.add(id);
}
}
return session.byMultipleIds(entityClass).enableOrderedReturn(false).withBatchSize(ids.length).multiLoad(notCached);
}
}
但它看起來不是一個好的解決方案
現在已經使用https://hibernate.atlassian.net/browse/HHH-12944修復了這個問題,它可以在Hibernate 5.4.0.CR1中找到。
假設您希望由1L,2L和3L標識的用戶現在可以使用:
session.byMultipleIds(User.class).enableSessionCheck(true).multiLoad( 1L, 2L, 3L);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.