Comment utiliser JPA2 de @Cacheable au lieu de Hibernate @Cache
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
}
De 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);
}
Vous devez vous connecter pour publier un commentaire.
Selon la JPA 2.0, si vous souhaitez sélectionner cache des entités à l'aide de la
@Cacheable
d'annotation, vous êtes censé pour spécifier un<shared-cache-mode>
dans lepersistence.xml
(ou l'équivalentjavax.persistence.sharedCache.mode
lors de la création de laEntityManagerFactory
).Ci-dessous, un exemple de
persistence.xml
avec les éléments pertinents et les propriétés:Noter que j'ai vu au moins un problème HHH-5303 liées à la mise en cache. Ce qui est au dessus n'est pas garanti 🙂
Références
Pour ceux qui utilisent le Printemps config au lieu de
persistence.xml
, voici un exemple:Notez également que si vous utilisez
@Cacheable
annotations, vous pouvez uniquement utiliser un cache par défaut de simultanéité de la stratégie, qui est déterminé par legetDefaultAccessType()
méthode de laRegionFactory
. En cas de EhCache c'est READ_WRITE. Si vous souhaitez utiliser une autre stratégie, vous devez utiliser Hibernate@Cache
annotations.