我正在使用带有配置的L2缓存的Hibernate 5.2.6(通过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)
)。
这是预期的行为还是我错误配置了什么?
答案 0 :(得分:0)
我已经使用帮助类进行了处理:
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);
}
}
但它看起来不是一个好的解决方案
答案 1 :(得分:0)
此问题现已由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);