繁体   English   中英

Hibernate Session.multiLoad L2缓存问题

[英]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中找到。

详细文档可以在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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM