¿Ejemplo de trabajo de Hibernate 3.6.2 caché de segundo nivel con JPA2?

l título obviamente lo dice: no puedo hacer que el caché de segundo nivel funcione para JPA2 / Hibernate 3.6.3.

He estado intentando muchos trucos para que funcione. Pero solo estoy logrando que la caché de consultas funcione. Aunque Hibernate crea las memorias caché (nombre de la instancia), se ignoran. Incluso los errores no están registrados. Tal vez es una incompatibilidad de versión. He probado algunos otros sin resultado. Y ya no me siento preparado para probar todas las permutaciones. :-PAG

Estoy haciendo la pregunta aquí, ya que algunas personas parecen tenerla funcionando (cuyos ejemplos probé también). Tal vez puedan detectar el error obvio que estoy cometiendo.

¡Gracias de antemano por cualquiera que me ayude! : -)

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 setup

De esta manera puedo verificar el uso de los cachés. Se crean los cachés (uno para cada entidad) y los dos cachés de consulta también están allí. Estos últimos se están llenando bastante rápido. Pero ninguno de los cachés muestra fallos o aciertos. Ni siquiera la consulta almacena en caché.

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

Los cachés de la entidad se ignoran. Deben contener al menos las entidades que se guardan en la base de datos. O ser recuperado con consultas. Nada se mueve allí.

Sample Java code

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

La fusión funciona, porque hay datos en la base de datos. Y el hallazgo funciona porque estoy obteniendo objetos con identificadores generados.

Las entidades consultadas se indexan en la base de datos.

WHODUNNIT?

Respuestas a la pregunta(2)

Su respuesta a la pregunta