我無法讓更新真正發生在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
提交
取消