Hibernate Session.multiload L2缓存问题



我正在使用配置的L2缓存(通过JHACHE/EHCACHE)使用Hibernate 5.2.6。我想通过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/hhhh-12944固定,可在Hibernate 5.4.0.cr1中使用。

可以在http://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/hibernate_user_guide.html#pc-by-multiple-ids上找到详细的文档。

假设您希望用用户通过1L,2L和3L标识的用户,您现在可以使用:

session.byMultipleIds(User.class).enableSessionCheck(true).multiLoad( 1L, 2L, 3L);

最新更新