vez que for lido do banco de dados ou gravado(commited) no mesmo. Se o dado ja estiver no cache, o modo USE naoira forcar um refresh quando o dado for lido do banco.Quando configurada para BYPASS, osdados lidos ou gravados no banco nao serao inseridos no cache. Eisso! O cache sera imutavel.Quando configurada para REFRESH o dadoe salvo no cache toda vez que for lido ou gravado no banco. Se odado ja estiver no cache, sera atualizado (refreshed) no cache.Configurando o Cache Retrieval ou oStore Mode.Para configurar o cache retrieval oustore mode, basta chamar o metodo EntityManager.setProperty docontexto de persistencia e passar como parametro o par {nome, valor} da propriedade:EntityManager em = ...;em.setProperty("javax.persistence.cache.storeMode", "BYPASS");Para configurar o cache retrieval ou store mode quando chamar osmetodos EntityManager.find ou EntityManager.refresh, primeiro crieuma instancia de Map<String, Object> e adicione os pares nome,valor conforme a seguir:EntityManager em = ...;Map<String, Object> props = new HashMap<String, Object>();props.put("javax.persistence.cache.retrieveMode", "BYPASS");String personPK = ...;Person person = em.find(Person.class, personPK, props);OBS: O cache retrieve mode sera ignorado na chamada do metodoEntityManager.refresh, pois as chamadas para refresh resultam sempreem dados lidos do banco e nunca do cache.Para configurar o retrieval ou storemode quando for usar queries, chame o metodo Query.setHint ou ometodo TypedQuerie.setHint, dependendo do tipo de query:EntityManager em = ...;CriteriaQuery<Person> cq = ...;TypedQuery<Person> q = em.createQuery(cq);q.setHint("javax.persistence.cache.storeMode", "REFRESH");...OBS: Configurar o store ou o retrieval mode em uma query ou chamandoos metodos EntityManager.find ou EntityManager.refresh sobrescreveas configuracoes do entity manager.Controlando o cache de segundo nivelprogramaticamente.A interface javax.presistence.Cachedefine metodos para interagir com o cache de segundo nivelprogramaticamente. A interface Cache define metodos para checar seuma entidade particular tem dados salvos no cache, para remover umaentidade particular do cache, para remover todas as instancias(inclusive de subclasses) de qualquer classe de entidade do cache epara limpar o cache de todos os dados das entidades.OBS: Se o cache de segundo nivel fordesabilitado, chamadas aos metodos da interface Cache nao teraoqualquer efeito sobre a aplicacao, exceto para o metodo contains,que sempre ira retornar false.Checando se os dados de uma entidadeestao no cache.Chame o metodo Cache.contains paraachar ou simplesmente para verificar se uma entidade esta no cachede segundo nivel. Este metodo retornara true se os dados daentidade estiverem em cache e false em caso contrario.EntityManager em = ...;Cache cache = em.getEntityManagerFactory().getCache();String personPK = ...;if (cache.contains(Person.class, personPK)) { // the data is cached} else { // the data is NOT cached}Removendo uma entidade do cache.Chame um dos metodos Cache.evict para remover uma entidade emparticular ou todas as entidades de um dado tipo do cache de segundonivel.Para remover uma entidade em particular chame Cache.evict passandoa classe da entidade e o Id (chave primaria).EntityManager em = ...;Cache cache = em.getEntityManagerFactory().getCache();String personPK = ...;cache.evict(Person.class, personPK);Para remover todas as instancias de uma classe de entidade,incluindo suas subclasses, chame evict e especifique a classe:EntityManager em = ...;Cache cache = em.getEntityManagerFactory().getCache();cache.evict(Person.class);Todas as instancias da classe Person serao removidas do cache. SePerson tiver subclasse, chame o metodo evictAll para remover suasinstancias tambem.Removendo todos os dados do cache. Chamar o metodo Cache.evictAll ira limpar completamente o cachede segundo nivel:EntityManager em = ...;Cache cache = em.getEntityManagerFactory().getCache();cache.evictAll();E e isso! Este post e o