我有一个单元测试,基本上可以完成以下任务:
使用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方法返回)没有分离。
答案 0 :(得分:0)
在我看来,当您致电entityManager.flush()
时,刷新实际上并没有发生。
由于FlushMode,休眠会检测到潜在的过时数据,并在查询之前刷新会话。尝试将其设置为MANUAL。