为了账号安全,请及时绑定邮箱和手机立即绑定

JPA 标准 Updatequery 并没有真正更新任何东西

JPA 标准 Updatequery 并没有真正更新任何东西

守候你守候我 2022-01-12 15:56:53
我无法让更新真正发生在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。


查看完整回答
反对 回复 2022-01-12
  • 1 回答
  • 0 关注
  • 501 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号