Jpa Hibernate: проблема чтения обновленных значений - PullRequest
0 голосов
/ 21 марта 2019

Я разрабатываю проект с использованием JPA и Hibernate, и у меня есть два потока:

  • Тема A: всегда читает и выводит различия
  • Поток B: имеет несколько операций записи и одну транзакцию, которая завершается после завершения записи данных

Если я удаляю данные или вставляю новые данные из / в базу данных, после принятия транзакций из потока B, в потоке A я вижу различия в том, что некоторые данные были удалены или добавлены. Моя проблема в том, что я обновляю существующие данные: после фиксации поток А не видит различий, если только я не очищаю EntityManager после каждого чтения.

Это свойства объекта управления сущностями:

    EntityManager em = EMF.createEntityManager();
    em.setProperty("hibernate.connection.autocommit", false);
    em.setProperty("hibernate.connection.isolation", 2); // read committed
    em.setProperty("javax.persistence.cache.storeMode", javax.persistence.CacheStoreMode.BYPASS);
    em.setProperty("javax.persistence.cache.retrieveMode", javax.persistence.CacheRetrieveMode.BYPASS);
    em.setProperty("hibernate.cache.use_query_cache", false);
    em.setProperty("hibernate.cache.use_second_level_cache", false);

Другое дело, что я настроил регистратор как показано ниже:

log4j.logger.org.hibernate=INFO, hb
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE

log4j.appender.hb=org.apache.log4j.ConsoleAppender
log4j.appender.hb.layout=org.apache.log4j.PatternLayout

чтобы показать мне все sql и установленные / возвращенные значения. Я заметил, что при первом чтении он читает каждое отдельное значение из базы данных, а после второго раза читает только идентификаторы и новые вставленные значения в случае вставки данных ... но при обновлении ничего не выглядит иначе.

Итак, учитывая, что я не использую кэш второго уровня Hibernate и что я обхожу режим хранения и получения для кеша сеансов, что происходит точнее, потому что я не могу понять и как я могу решить эту проблему без очистки контекст постоянства после каждого чтения?

Спасибо.

1 Ответ

0 голосов
/ 21 марта 2019

Кэш второго уровня по умолчанию отключен в Hibernate (свойства для него не применимы). Вы имеете дело с кешем первого уровня. Он существует во время сеанса Hibernate.

Сеанс действует как кэш постоянных данных на уровне транзакций. Когда сущность становится удалось, этот объект добавлен во внутренний кэш текущего контекста персистентности (EntityManager или Session). Контекст постоянства также называется кэшем первого уровня, и это включен по умолчанию.

http://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...