博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
事务中更新无效问题解决
阅读量:6274 次
发布时间:2019-06-22

本文共 1908 字,大约阅读时间需要 6 分钟。

hot3.png

写单测,为了让单测自动回滚,在单测方法上增加了@Transactional。单测逻辑如1)创建实体,2)更新实体属性,3)读取实体。

发现在更新实体后的属性并未更新,猜测原因应该是事务提交之前,数据未到数据库,各条语句的执行结果有对应的缓存,需要刷新才能保持一致性?

代码如:

@RunWith(SpringRunner.class)@SpringBootTestpublic class TestRepositoryTest {    @Autowired    private LisenceRepository lisenceRepository;    @PersistenceContext    private EntityManager entityManager;        @Test    @Transactional    public void testB() throws Exception {        //1)创建实体        Lisence lisence = new Lisence();        lisence.setIsValid(true);        lisence.setLisenceContent("test");        lisence.setCreatedDate(new Date());        lisenceRepository.save(lisence);        //2)更新实体        List
lisences = lisenceRepository.findByLisenceContent("test"); Assert.assertNotNull(lisences); Assert.assertTrue("Should have valid lisence", lisences.size() > 0); lisenceRepository.updateIsValidById(lisences.get(0).getId(), false);// entityManager.flush();// entityManager.clear(); //3)验证更新过的实体属性 Optional
invalidLisence = lisenceRepository.findById(lisences.get(0).getId()); Assert.assertTrue(invalidLisence.isPresent()); Assert.assertFalse("Lisence should be invalid", invalidLisence.get().getIsValid()); }}

两种方式可以解决:

1)引入EntityManager,在更新语句实行完成之后,调用flush()和clear(),

2)jpa的更新语句增加 flushAutomatically=true, clearAutomatically=true:

@Transactionalpublic interface LisenceRepository extends JpaRepository
{ @Modifying(flushAutomatically=true, clearAutomatically=true) @Query(value = "update Lisence set is_valid = :is_valid where id = :id", nativeQuery = true) void updateIsValidById(@Param("id") Long id, @Param("is_valid") boolean isValid);}

 

参考:

https://blog.csdn.net/cyoubunketu/article/details/79740562

https://stackoverflow.com/questions/33074547/spring-boot-configure-entitymanager

 

转载于:https://my.oschina.net/u/4042451/blog/3019798

你可能感兴趣的文章
MyBatis-Plus | 最简单的查询操作教程(Lambda)
查看>>
rpmfusion 的国内大学 NEU 源配置
查看>>
spring jpa 配置详解
查看>>
IOE,为什么去IOE?
查看>>
java 用反射简单应用,将Object简单转换成map
查看>>
Storm中的Worker
查看>>
dangdang.ddframe.job中页面修改表达式后进行检查
查看>>
Web基础架构:负载均衡和LVS
查看>>
Linux下c/c++相对路径动态库的生成与使用
查看>>
SHELL实现跳板机,只允许用户执行少量允许的命令
查看>>
SpringBoot 整合Redis
查看>>
nodejs安装以及环境配置(很好的node安装和配置文章,少走很多弯路)
查看>>
2014上半年大片早知道
查看>>
Android 6.0指纹识别App开发案例
查看>>
ios runtime基础知识
查看>>
正文提取算法
查看>>
Arcgis Engine(ae)接口详解(8):临时元素(element)
查看>>
大数据技术核心之ETL
查看>>
轻松学PHP
查看>>
Android android.support.design包
查看>>