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

我无法让更新真正发生在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)



守候你守候我
浏览 502回答 1
1回答

HUX布斯

您的所有测试都发生在一个事务中,因此第一次加载实体时,它们会存储在会话缓存中。第二次加载它们时,它们只是再次从会话缓存中检索:更新查询绕过缓存。您需要在再次获取实体之前清除 EntityManager。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java