在JPA中分离对象

时间:2019-04-22 05:37:17

标签: java hibernate 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 个答案:

答案 0 :(得分:0)

在我看来,当您致电entityManager.flush()时,刷新实际上并没有发生。

由于FlushMode,休眠会检测到潜在的过时数据,并在查询之前刷新会话。尝试将其设置为MANUAL。

请参见Hibernate FlushMode