Généralement , j'utilise Hibernate @Cache(utilisation = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) à cache un @Entité de la classe , et il fonctionne bien.
Dans JPA2 , il y a une autre @Cacheable annotation qui semble être la même fonctionnalité avec Hibernate @Cache. Pour faire ma classe d'entité indépendante de hibernate paquet , j'ai envie de lui donner un essai. Mais je ne peux pas le faire fonctionner. Chaque fois qu'une simple requête id heurte encore à la DB.
Quelqu'un peut-il me dire d'où vient le problème ? Merci.
Classe d'entité :
@Entity
//@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Cacheable(true)
public class User implements Serializable
{
// properties
}
La classe de Test :
@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));
}
}
Le résultat du test montre chaque "get" hits DB couche (avec mise en veille prolongée.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"/>
JPA code :
@Override
public T get(Serializable id)
{
return em.find(clazz, id);
}