У меня есть вопрос о запросе кеширования Hibernate JPA.
Допустим, у меня есть несколько записей ClientConfiguration в кэше. После добавления новой записи в таблицу и удаления кеша вручную - новая запись не появляется в наборе результатов. Только через некоторое время (которое, как я полагаю, по умолчанию используется для обновления кэша sh), запись появляется в наборе результатов.
Другая проблема заключается в том, что когда запись через некоторое время (после завершения по умолчанию) находится в кэше, и я вручную удалить его из таблицы и создать кеш, я получаю Причины: javax.persistence.EntityNotFoundException: Невозможно найти com.xxx.xxx.xxx.entity.ClientConfiguration с идентификатором 122
Вот мое постоянство. xml:
<persistence-unit name="XXXXXXXXXXXXX"
transaction-type="JTA">
<jta-data-source>java:jboss/datasources/XXXXXXXXXX</jta-data-source>
<class>xxx.xxx.xxx.xxx.entity.ClientConfiguration</class>
<properties>
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="true" />
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.jcache.JCacheRegionFactory" />
<property name="hibernate.javax.cache.provider" value="org.ehcache.jsr107.EhcacheCachingProvider" />
<property name="hibernate.javax.cache.uri" value="ehCache.xml" />
<property name="javax.persistence.sharedCache.mode" value="ENABLE_SELECTIVE" />
Мой класс сущности:
@Entity
@Table
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class ClientConfiguration {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
Я получаю ClientConfiguration из БД, используя следующий запрос:
private static final String FIND_BY_GROUP_AND_PROPERTY = "SELECT c FROM ClientConfiguration c WHERE c.groupName = :groupName AND c.propertyName = :propertyName";
@Inject
private EntityManager em;
@SuppressWarnings("unchecked")
public List<PartnerConfiguration> findForAllClients(String groupName, String propertyName) {
Query query = em.createQuery(FIND_BY_GROUP_AND_PROPERTY).setHint("org.hibernate.cacheable", true);
query.setParameter("groupName", groupName);
query.setParameter("propertyName", propertyName);
List<PartnerConfiguration> resultList = query.getResultList();
return resultList;
}
Теперь, если я вручную добавьте еще одну запись в ClientConfguration с тем же groupName и именем свойства, после выполнения указанного выше запроса новая запись не будет в наборе результатов.
ОК. Затем я очищаю кеш:
@Inject protected EntityManager em;
...
em.getEntityManagerFactory().getCache().evictAll();
И после повторного выполнения запроса эта запись все еще не находится в наборе результатов.
Другая проблема заключается в том, что когда через некоторое время запись кэшируется, и я вручную удалите его из таблицы и очистите кеш, затем в приложении я получаю:
Caused by: javax.persistence.EntityNotFoundException: Unable to find xxx.xxx.xxx.xxx.entity.ClientConfiguration with id 122