Рабочий пример кэширования второго уровня Hibernate 3.6.2 с JPA2?

В заголовке явно сказано: Я не могу заставить кеш второго уровня работать для JPA2 / Hibernate 3.6.3.

Я пытался много хитростей, чтобы заставить его работать. Но мне удается только заставить работать кеш запросов. Хотя Hibernate создает кеши (имя экземпляра), они игнорируются. Даже промахов не зарегистрировано. Может дело в несовместимости версий. Я пробовал другие безрезультатно. И я больше не чувствую себя в состоянии пробовать все перестановки. :-P

Я задаю вопрос здесь, так как у некоторых людей это работает (чьи примеры я тоже пробовал). Может быть, они заметят очевидную ошибку, которую я делаю.

Заранее спасибо всем, кто мне помог! : -)

persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
         version="2.0">

<persistence-unit name="foo" transaction-type="RESOURCE_LOCAL">
    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
    <properties>
        <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
        <property name="javax.persistence.jdbc.url" value="jdbc:derby:/opt/db/foo;create=true"/>
        <property name="javax.persistence.jdbc.user" value="foo"/>
        <property name="javax.persistence.jdbc.password" value="bar"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect"/>
        <property name="hibernate.hbm2ddl.auto" value="create"/>
        <property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory"/>
        <property name="hibernate.cache.use_second_level_cache" value="true"/>
        <property name="hibernate.cache.use_query_cache" value="true"/>
    </properties>
</persistence-unit>

pom.xml

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>3.6.3.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate.javax.persistence</groupId>
        <artifactId>hibernate-jpa-2.0-api</artifactId>
        <version>1.0.0.Final</version>
    </dependency>
    <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache-core</artifactId>
    <version>2.4.2</version>

Настройка JMX

Таким образом я могу проверить использование кешей. Создаются кеши (по одному для каждой сущности), а также два кеша запросов. Последние довольно быстро заполняются. Но ни один из кешей не отображает ни промахов, ни попаданий. Даже кеши запросов.

 ManagementService.registerMBeans( CacheManager.getInstance(), ManagementFactory.getPlatformMBeanServer(), true, true, true, true, true )

Кеши сущностей игнорируются. Они должны содержать как минимум те сущности, которые сохранены в базе данных. Или извлекается с помощью запросов. Там ничего не движется.

Пример кода Java

EntityManager entityManager = Persistence.createEntityManagerFactory("foo").createEntityManager();
entityManager.getTransaction.begin();
entityManager.merge(bar);
entityManager.getTransaction.commit();   

Query query = entityManager.createQuery("select b from Bar p where b.name = :name");
query.setParameter("name", "fooBar");
query.setHint("org.hibernate.cacheable","true");
query.getSingleResult();

Слияние работает - потому что в базе данных есть данные. И поиск работает, потому что я получаю объекты с сгенерированными идентификаторами.

Запрошенные объекты индексируются в базе данных.

WHODUNNIT?

8
задан Matt Ball 21 June 2011 в 15:55
поделиться