JPA + Hibernate + EHCache, comportamento inesperado

Estou tentando implementar o EHCache no meu protótipo de trabalho, onde tenho umjavax.persistence.Entity representando uma tabela no meu banco de dados (MySQL, mysql-connector-java-5.1.20.jar), que é fornecido como XML para os consumidores.

O problema que estou enfrentando é que parece que o Hibernate ainda está recuperando os dados do banco de dados,mesmo quando o EHCache armazena o resultado da consulta na memória.

Estou usando oMonitor EHCache para ver a contagem de itens na memória e alterar os dados diretamente no banco de dados antes que o cache expire para saber se os dados armazenados em cache são realmente usados.

Eu tenho procurado por uma replicação para este problema sem ter sucesso, então talvez eu esteja perdendo alguma coisa (eu acabei de entrar no mundo java).

Meus arquivos

pom.xml

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>4.3.0.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.1.4.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-ehcache</artifactId>
    <version>4.1.4.Final</version>
</dependency>
<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache-core</artifactId>
    <version>2.5.2</version>
</dependency>
<dependency>
    <groupId>org.terracotta</groupId>
    <artifactId>ehcache-probe</artifactId>
    <version>1.0.2</version>
</dependency>

Classe de entidade

package myPrototype.entities

import javax.persistence.Cacheable;
import javax.persistence.Entity;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

@Entity @Cacheable
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
@Table(name = "Cars")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Cars.findAll", query = "SELECT d FROM Cars d"),
    [...]
public class Cars implements Serializable {
    private static final long serialVersionUID = 1L;
    @Basic(optional = false)
        @NotNull
        @Column(name = "id")
    @ReferenceField
    private int id;
    [...]

ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
  <cache name="myPrototype.entities.Cars"
    maxElementsInMemory="500"
    eternal="false"
    overflowToDisk="false"
    timeToIdleSeconds="60"
    timeToLiveSeconds="120" />
</ehcache>

* Eu tentei definir eterno = "true", mas o resultado ainda é o mesmo

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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">
  <persistence-unit name="MyPrototype" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>java:app/jdbc/mysqlserver/prototype</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
    <properties>
      <!-- property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory"/ -->
      <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory" />
      <property name="hibernate.cache.use_second_level_cache" value="true"/>
      <property name="hibernate.cache.use_query_cache" value="true"/>
      <property name="hibernate.cache.region_prefix" value=""/>
    </properties>
  </persistence-unit>
</persistence>

* Eu tentei alternar entre SingletonEhCacheRegionFactory e EhCacheRegionFactory

EJB

import myPrototype.entities.Cars
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class CarsEJB {

    @PersistenceContext(unitName="MyPrototype")
    private EntityManager em;

    @Override
    public List<Cars> getCars() {
        return (List<Cars>)em.createNamedQuery("Cars.findAll").setMaxResults(200).getResultList();
    }

}

* Adicionado para esclarecer como eu executo a consulta

Como eu disse, eu posso ver uma contagem de itens na memória através do monitor do EHCache, então observei o seguinte: - A configuração do ehcache é que os elementos carregados da propriedade estão expirando - A expiração de elementos não sendo redefinida quando a consulta é executada enquanto eles ainda estão vivos expira N segundos após a primeira consulta).

Novamente; Eu sou um novato com java, então acho que poderia estar faltando conceitos básicos.

Obrigado pela leitura!

questionAnswers(1)

yourAnswerToTheQuestion