亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 500 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號