powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA merge видит обновления объекта при каждом четном запросе
4 сообщений из 4, страница 1 из 1
JPA merge видит обновления объекта при каждом четном запросе
    #38883589
BaurzhanS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Описание моей ситуации в 5 пунктах. Вопрос ниже.

1) Загружаю в персистенс контекст несколько сущностей по ключу, выполняя для каждого нужного мне идентификатора
Код: java
1.
entityManager.find(Document .class, id);



2) Создаю простой инстанс сущности, так называемый detached instance, заполняя идентификатор из attahced инстанса -

Код: java
1.
2.
managedDoc = getFromSomeDataStructure(); 
Document nonManaged = new Document(managedDoc.getId()); 




3) Нон-манаджед инстансу прописываю некоторые свойства, например nonManaged.setSigned(true);

4) делаю апдейт в базе посредством

Код: java
1.
2.
em.merge(nonManaged);
em.flush();

// также пробовал коментить флаш

5) есть другой запрос, который срабатывает при обновлении страницы, он тупо выбирает все записи -
Query query = entityManager.createQuery("from Document");

Код: java
1.
2.
3.
4.
5.
  //query.setHint("javax.persistence.cache.retrieveMode", "BYPASS"); // skip the L2 cache.
        List<Document> list = query.getResultList();
        //for(Document doc:list) System.out.println(doc.getName()+" "+doc.isSigned());
        return list;
        //return query.getResultList();



Проблема в том, новые свойства, записанные в базу посредством мерджа срабатывают, воркбенч показывает, что свойство установилось. Но select-all запрос при первом нажатии F5 и каждых нечетных нажатиях не видит новое значение свойства isSigned, а при четных нажатиях видит так, как лежит в базе.

Мои мысли - либо при нечетных нажатиях select-all запрос смотрит в кэше, где неправильное старое значение, а при четных - в базе. Либо это как то связано с тем, что в хибернейт классе это свойство имеет дефолтовое значение -
Код: java
1.
2.
@Column(name="isSigned")
    private Boolean signed=false; 


Но версия с дефолтоным значением отпадает - это нужно только для инсерта, при чем тут селект.

Я где-то читал, что персистенс контекст это такая внутрення структура данных, в которой сущности хранятся по ключу(если есть поле с соотвествующей аннотацией, либо какой-то свой автоинкремент используется). У меня есть поле идентификатор. Поэтому я ожидаю - что сущности, вытащенные разными способоами - через find(id) и через select-all и имеющие одинаковый ID, будут считаться как одно и то же в персистенс конетксте. По всей видимости, это не так, и из-за этого глюк. Но как тогда сделать такое - вытаскивать несколько по идентификатору, а потом вытаскивать все простым селектом и чтобы не было глюка с четными/нечетными нажатиями. Вообще говоря, такое ощущение, что в персистенсе контексе две сущности с одинаковым айди - которая через файнд нашлась имеет новое свойство, а которая через селект олл, несмотря на одинаковый ID , в персистенс контекст зашла со старым свойсвом. И персистенс контекст аидит запрос вида отдай сущность по айди и поочерено дает то одну, то другую.
...
Рейтинг: 0 / 0
JPA merge видит обновления объекта при каждом четном запросе
    #38883622
eJack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BaurzhanS,

Как управляете транзакциями?
...
Рейтинг: 0 / 0
JPA merge видит обновления объекта при каждом четном запросе
    #38883691
BaurzhanS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нeJack, у меня update в @Transactional методе, то есть спринг сам управляет. Селект не транзакционный.
...
Рейтинг: 0 / 0
JPA merge видит обновления объекта при каждом четном запросе
    #38884837
BaurzhanS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ответ на мой вопрос . Если вкратце, то надо обновлять состояние объекта=синхронизировать с БД командой refresh(). Коменты на стековерфлоу тоже полезные - read commited еще надо ставить, в персистенс.хмл isolastion.level="2"
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA merge видит обновления объекта при каждом четном запросе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]