我无法让更新真正发生在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()每一个可以想象的地方都试过了。commit()某处是否应该有一些额外的或一些 Spring 数据设置?行已正确插入。我可以看到相应的日志行,例如:TestEntity(super=org.example.spring.entity.updatequery.TestEntity@230a73f2, id=1, message=not changed)我可以看到更新查询和绑定正确(?):休眠:更新test_entity设置消息=?.... org.hibernate.type.descriptor.sql.BasicBinder:65 - 绑定参数 [1] 作为 [VARCHAR] - [ALTERED TEXT!]但是更新后我看不到变化,但是:TestEntity(super=org.example.spring.entity.updatequery.TestEntity@230a73f2, id=1, message=not changed)
1 回答

HUX布斯
TA贡献1876条经验 获得超6个赞
您的所有测试都发生在一个事务中,因此第一次加载实体时,它们会存储在会话缓存中。第二次加载它们时,它们只是再次从会话缓存中检索:更新查询绕过缓存。
您需要在再次获取实体之前清除 EntityManager。
添加回答
举报
0/150
提交
取消