Hibernate JPA проблема второго уровня кэширования и выселения - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть вопрос о запросе кеширования 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
...