У меня есть объект Employee вместе с именованным запросом ниже:
@NamedQueries({ @NamedQuery(name="findMyEmployees", query="SELECT e FROM Employee e", hints={@QueryHint(name="org.hibernate.cacheable", value="true"),
@QueryHint(name = "org.hibernate.cacheRegion", value = "myCacheRegion"),
@QueryHint(name = "org.hibernate.RetrieveMode", value = "USE")
}), })
@Entity @Cache(region="myCacheRegion", usage=CacheConcurrencyStrategy.READ_ONLY) public class Employee{
@Id
@GeneratedValue
private long id;
private String name;
private String dept; ... ... }
Сохранение моих сотрудников, как показано ниже в цикле:
Employee employee = new Employee();
employee.setName("Name");
employee.setDept("Department");
EntityManager em = entityManagerFactory.createEntityManager();
em.setProperty("javax.persistence.cache.storeMode", CacheStoreMode.USE);
em.getTransaction().begin();
em.persist(employee);
em.getTransaction().commit();
em.close();
Получение результатов запроса, как показано ниже:
EntityManager em = entityManagerFactory.createEntityManager();
Query q = em.createNamedQuery("findMyEmployees");
return (Collection<Employee>) q.getResultList();
Результаты кэшируются. Теперь, удалив одного из сотрудников, как показано ниже:
EntityManager em = entityManagerFactory.createEntityManager();
Employee employee = em.find(Employee.class, id);
em.setProperty("javax.persistence.cache.storeMode", CacheStoreMode.BYPASS);
em.getTransaction().begin();
em.remove(employee);
em.getTransaction().commit();
Когда я снова пытаюсь получить сотрудников, попадание направляется в базу данных, а не в кэш. Запрос о помощи
My persistence.xml:
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="javax.persistence.schema-generation.database.action" value="create"/>
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>
<property name="hibernate.cache.region_prefix" value=""/>
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.show_sql" value="true"/>
<property name="org.hibernate.flushMode" value="COMMIT"/>
</properties>