JPA条件Updatequery并未真正更新任何内容

时间:2018-11-11 11:54:02

标签: java hibernate jpa spring-data-jpa criteria-api

Iphone 6, iOS 11.3 我无法进行更新。有一个简单的测试类:

Updatequery

和类似的测试:

@Entity
@ToString(callSuper = true)
// query just for logging purposes
@NamedQuery(name="TestEntity.findAll", query="SELECT t FROM TestEntity t")
public class TestEntity {
    @Id
    @GeneratedValue
    private Long id;    
    private String message = "not altered";
}    

它一定很简单,但是我看不到什么?我还在每个可以想象的地方都尝试过@Slf4j @DataJpaTest @org.springframework.transaction.annotation.Transactional(propagation = Propagation.NOT_SUPPORTED) @RunWith(SpringRunner.class) public class TestEntityUpdateTest { @PersistenceContext private EntityManager em; private void buildTestEntity(int i) { em.persist(new TestEntity()); } private void log(Object o) { log.info("\n{}", o); } @Test @Transactional public void testUpdate() { IntStream.range(1, 4).forEach(this::buildTestEntity); TypedQuery<TestEntity> tq = em.createNamedQuery("TestEntity.findAll", TestEntity.class); // log inserted stuff log.info("\nINSERTED rows"); tq.getResultList().forEach(this::log); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaUpdate<TestEntity> update = cb.createCriteriaUpdate(TestEntity.class); Root<TestEntity> from = update.from(TestEntity.class); update.set(from.get("message"), "ALTERED TEXT!"); int i = em.createQuery(update).executeUpdate(); log.info("\nUPDATED {} rows", i); // log updated stuff tq.getResultList().forEach(this::log); } }

在某处应该有一些额外的em.flush()或一些Spring数据设置吗?

行已正确插入。我可以看到相应的日志行,例如:

  

TestEntity(super=org.example.spring.entity.updatequery.TestEntity@230a73f2,   id = 1,消息=未更改)

我可以看到更新查询和绑定正确(?):

  

休眠:
      更新
          test_entity
      设置
          message =?
     ....   org.hibernate.type.descriptor.sql.BasicBinder:65-绑定参数   [1]为[VARCHAR]-[ALT​​ERED TEXT!]

更新后,我看不到更改,但是:

  

TestEntity(super=org.example.spring.entity.updatequery.TestEntity@230a73f2,   id = 1,消息=未更改)

来自commit()的相关部分(要求更多):

pom.xml

1 个答案:

答案 0 :(得分:2)

所有测试都在单个事务中进行,因此,第一次加载实体时,它们会存储在会话缓存中。第二次加载它们时,它们只是再次从会话缓存中检索:更新查询会绕过缓存。

您需要先清除EntityManager,然后再重新获取实体。