【问题标题】:Hibernate Session.multiLoad L2 cache issueHibernate Session.multiLoad L2 缓存问题
【发布时间】:2017-05-12 16:35:10
【问题描述】:

我正在使用 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 (?,...,?)

在日志中和用户实体被放置到二级缓存中。

第二次调用在日志中触发了相同的 SQL 语句,并且没有从 L2 缓存中检索实体。

使用 L1 缓存不会出现此问题(使用 enableSessionCheck(true))。

这是预期的行为还是我配置错误?

【问题讨论】:

  • 我面临同样的问题。在此期间您找到任何答案了吗?
  • 看看我下面的答案。

标签: java hibernate caching second-level-cache


【解决方案1】:

我已经用辅助类解决了这个问题:

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);
    }

}

但这看起来不是很好的解决方案

【讨论】:

    【解决方案2】:

    这个问题现在已经用 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);
    

    【讨论】:

      猜你喜欢
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 2023-04-09
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      相关资源
      最近更新 更多