Cómo usar el @Cacheable de JPA2 en lugar del @Cache de Hibernate

Por lo general, uso Hibernate@Cache (uso = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) almacenar en caché una clase @Entity, y funciona bien.

En JPA2, hay otra anotación @Cacheable que parece ser la misma funcionalidad con @Cache de Hibernate. Para hacer que mi clase de entidad sea independiente del paquete de hibernate, quiero intentarlo. Pero no puedo hacer que funcione. Cada vez que una simple consulta de identificación aún llega a la base de datos.

¿Alguien puede decirme dónde sale mal? Gracias.

Clase de entidad:

@Entity
//@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Cacheable(true) 
public class User implements Serializable
{
 // properties
}

Clase de prueba:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:app.xml"})
@TransactionConfiguration(transactionManager="transactionManager")
public class UserCacheTest
{
  @Inject protected UserDao userDao;

  @Transactional
  @Test
  public void testGet1()
  {
    assertNotNull(userDao.get(2L));
  }

  @Transactional
  @Test
  public void testGet2()
  {
    assertNotNull(userDao.get(2L));
  }

  @Transactional
  @Test
  public void testGet3()
  {
    assertNotNull(userDao.get(2L));
  }
}

El resultado de la prueba muestra cada capa de base de datos "get" hits (con hibernate.show_sql = true).

Persistence.xml:

<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.use_outer_join" value="true"/>

<property name="hibernate.cache.provider_class" value="org.hibernate.cache.SingletonEhCacheProvider"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>

Código JPA:

@Override
public T get(Serializable id)
{
  return em.find(clazz, id);
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta