Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA merge видит обновления объекта при каждом четном запросе / 4 сообщений из 4, страница 1 из 1
19.02.2015, 10:00
    #38883589
BaurzhanS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA merge видит обновления объекта при каждом четном запросе
Описание моей ситуации в 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
19.02.2015, 10:29
    #38883622
eJack
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA merge видит обновления объекта при каждом четном запросе
BaurzhanS,

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


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