Запрос Уровень 2 Кэширование, выбрасывающее ClassCastException - PullRequest
2 голосов
/ 07 июня 2010

Я использую JPA и Hibernate для базы данных. Я настроил (EHCacache) кэш второго уровня и кэш уровня запросов, но просто для того, чтобы убедиться, что кэширование работает, я пытался получить статистику, которая выдает исключение приведения класса. Любая помощь будет высоко оценена. Моя главная цель - увидеть все объекты, которые были кэшированы, чтобы убедиться, что кэширование работает правильно.

Вот код:

public List<CodeValue> findByCodetype(String propertyName) {

    try {
        final String queryString = "select model from CodeValue model where model.codetype"
                + "= :propertyValue" + " order by model.code";

        Query query = em.createQuery(queryString);
        query.setHint("org.hibernate.cacheable", true);
        query.setHint("org.hibernate.cacheRegion", "query.findByCodetype");
        query.setParameter("propertyValue", propertyName);
        List resultList = query.getResultList();

        org.hibernate.Session session = (Session) em.getDelegate();
        SessionFactory sessionFactory = session.getSessionFactory();
        Map cacheEntries = sessionFactory.getStatistics()
                .getSecondLevelCacheStatistics("query.findByCodetype")
                .getEntries();
        logger.info("The statistics are: " + cacheEntries);
        return resultList;

    } catch (RuntimeException re) {
        logger.error("findByCodetype failed in trauma patient", re);
        throw re;
    }

}

Ошибка существует, когда я пытаюсь распечатать статистику. Ниже приведено исключение:

[6/7/10 19:23:17:059 GMT] 00000034 SystemOut     O java.lang.ClassCastException: org.hibernate.cache.QueryKey incompatible with org.hibernate.cache.CacheKey
    at org.hibernate.stat.SecondLevelCacheStatistics.getEntries(SecondLevelCacheStatistics.java:51)
    at com.idph.trauma.registry.service.TraumaPatientDAO.findByCodetype(TraumaPatientDAO.java:439)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:615)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    at $Proxy209.findByCodetype(Unknown Source)

Вы знаете, что происходит?

1 Ответ

1 голос
/ 08 июня 2010

Hibernate становится дрянным, когда вы используете одну и ту же область кэша L2 как для сущностей, так и для запросов. Как правило, это не имеет большого значения, оно будет работать нормально, но некоторые операции (например, эта) вызовут ошибку. Разработчики Hibernate, похоже, не склонны это исправлять.

Убедитесь, что в кеше запросов используется другая область кеша для кеша сущностей.

См. сообщение на форуме для обсуждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...