簡體   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