Отсоединение объекта в JPA

#java #hibernate #jpa

#java #переход в спящий режим #jpa

Вопрос:

У меня есть модульный тест, который в основном выполняет следующее:

  1. Запрос объекта на основе критериев
  2. Измените значение его свойства
  3. Обновление с использованием 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