#java #hibernate #jpa
#java #переход в спящий режим #jpa
Вопрос:
У меня есть модульный тест, который в основном выполняет следующее:
- Запрос объекта на основе критериев
- Измените значение его свойства
-
Обновление с использованием WHERE id = ? и an_attr = ?
// Given we have data inserted already ContextInfo ctx = createContextInfo(); DocumentDescriptor desc = createDocumentDescriptor(ctx); // With status = NOT OK desc.setStatus("RESPONSE_NOTOK"); dao.insert(ctx, desc); entityManager.flush(); // When updating status with the correct last status desc = dao.findByDescriptorProperties(ctx, desc.getSelector(), desc.getTransaction(), desc.getType(), desc.getClientId()); desc.setStatus("RESPONSE_OK"); Query x = entityManager.createQuery("from " desc.getClass().getSimpleName()); List<DocumentDescriptor> res = x.getResultList(); // Watch [[THIS]] marker dao.updateWithOldTransactionStatus(ctx, desc, "RESPONSE_NOTOK");
Каким-то образом на маркере ([[THIS]]) я вижу, что режим гибернации делает это:
2019-04-22 12:43:52,418 [main] DEBUG org.hibernate.engine.spi.ActionQueue - Changes must be flushed to space: DocumentDescriptor
2019-04-22 12:43:52,540 [main] DEBUG org.hibernate.SQL - update DocumentDescriptor set modTime=?, modTransactionId=?, modUser=?, techTransactionId=?, obsolete=?, status=?, docTimestamp=?, version=? where id=?
Я этого не хочу, потому что я хочу только обновить значение вместе с другим атрибутом в качестве условия (см. Следующую строку). Мне кажется, что объект (возвращаемый методом findByDescriptorProperties) не отсоединен.
Ответ №1:
Мне кажется, что сброс не происходит на самом деле, когда вы звоните entityManager.flush()
.
Из-за режима FlushMode hibernate обнаруживает потенциально устаревшие данные и сбрасывает сеанс перед запросом. Попробуйте установить его ВРУЧНУЮ.
См. раздел Hibernate FlushMode