首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

仅在spring boot项目中使用@transactional之后,才会在调用save之后获取null id

在Spring Boot项目中使用@Transactional注解后,才会在调用save方法后获取null id的原因是事务的回滚机制。下面是完善且全面的答案:

在Spring Boot中,@Transactional注解用于标记一个方法或类需要在事务中执行。当使用@Transactional注解时,Spring会为该方法创建一个事务,并在方法执行结束后根据事务的提交或回滚情况来决定是否将对数据库的操作进行持久化。

在调用save方法后获取null id的情况下,可能是由于事务的回滚导致的。事务的回滚可以通过抛出RuntimeExceptionError异常来触发,或者在方法中调用setRollbackOnly()方法来手动设置回滚。

当事务回滚时,所有在事务中进行的数据库操作都会被撤销,包括对实体对象的保存操作。因此,当调用save方法后,如果事务回滚了,就无法获取到保存后的实体对象的id,而会得到null值。

解决这个问题的方法是确保事务正常提交而不回滚。可以通过以下几种方式来避免事务回滚:

  1. 确保方法内部没有抛出RuntimeExceptionError异常。
  2. 避免在方法内部调用setRollbackOnly()方法。
  3. 确保方法上的@Transactional注解的rollbackFor属性没有设置为包含RuntimeExceptionError的异常类型。

另外,Spring Boot提供了一些与事务相关的注解和配置选项,可以进一步控制事务的行为。例如,可以使用@Transactional(propagation = Propagation.REQUIRED)注解来指定事务的传播行为,或者使用@Transactional(isolation = Isolation.READ_COMMITTED)注解来指定事务的隔离级别。

推荐的腾讯云相关产品和产品介绍链接地址:

  1. 云数据库 TencentDB:提供高性能、可扩展的云数据库服务,支持多种数据库引擎,包括MySQL、SQL Server、MongoDB等。了解更多信息,请访问:TencentDB
  2. 云服务器 CVM:提供可靠、安全的云服务器实例,支持多种操作系统和应用场景。了解更多信息,请访问:云服务器 CVM
  3. 云原生应用引擎 TKE:提供全托管的Kubernetes容器服务,帮助用户快速构建、部署和管理容器化应用。了解更多信息,请访问:云原生应用引擎 TKE

请注意,以上推荐的腾讯云产品仅供参考,具体选择应根据实际需求和情况进行。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

TransactionTemplate编程式事务管理

声明式事务控制方式 (@Transactional) 将DB访问封装到 @Service/@Component 类, 并将具体访问过程放到一个 public 方法, 并加上 @Transactional...JDO 技术: JdoTransactionManager 分布式事务: JtaTransactionManager Spring Boot 项目中, 引入了 spring-boot-starter-jdbc...如果我们项目有多个数据源, 或者既引入了 spring-boot-starter-jdbc, 又引入了 spring-boot-starter-data-jpa 依赖, 自动注入事务控制器就会混乱, 所以需要创建一个...注意自调用问题, @Transactional 注解仅在外部类的调用生效, 原因是使用 Spring AOP 机制造成的....关于自调用问题和 Public 的限制, 是因为Spring 使用Spring AOP 代理造成的, 如果要解决这两个问题, 使用 AspectJ 取代 Spring AOP 代理.

7.5K30
  • SpringBoot系列教程JPA之update使用姿势

    -- more --> 通过本篇博文,您至少可以选到 save() 直接根据id来修改记录 利用jpl 实现查询修改的使用姿势 初识事物的神秘面纱 I....使用姿势 a. save 在前面一篇插入博文中,我们知道当POJO的id存在时,调用save方法可能有两种情况 若db这个id对应的字段不存在,则插入 若db这个id对应的字段存在,则更新 我们来试一下更新的效果...上面这个使用姿势看完之后,会有一个明显的感觉,这个更新的支持,必须先获取目标对象再进行修改,很难满足我们的日常业务场景; b....下面推荐几篇博文 mysql之锁与事务详解 Spring学习之事务的使用姿势 Spring学习之事务管理与传播属性 关于jpa更多事务相关的,后面再引入,我们先回到本文主题,如何解决问题: 在调用上面的方法上面添加事务注解即可.../blob/master/spring-boot/102-jpa 相关博文 mysql之锁与事务详解 Spring学习之事务的使用姿势 Spring学习之事务管理与传播属性 190612-SpringBoot

    2.2K10

    当@Transactional遇到@CacheEvict,会不会先清缓存呢?

    Spring是通过 AOP 动态代理来实现的,添加这个注解后,会在方法执行完之后提交事务。...demo程序 在执行 save 方法之前,通过调用 getById 方法已经将对应的数据缓存到了 redis 。同时,数据库 countNumber 的值为 1。...先清除缓存,然后在事务还没有提交之前,服务器就收到了新的用户请求,然后,发现缓存没有数据,则去数据库获取数据(事务还没有提交则获取到旧值),同时将获取的数据添加到缓存。...@Transactional和@CacheEvict都是通过动态代理来实现的,在执行 save 方法处打一个断点,命中断点之后,点击Step Into,程序向下执行一行,就可以进入到代理对象的执行方法...在 SpringBoot2.0 之后,SpringBoot AOP 的默认实现被设置成了默认使用 CGLIB 来实现了。

    1.2K20

    玩转 Spring Boot 集成篇(MyBatis、JPA、事务支持)

    使用 Spring 进行实际项目研发Spring 整合 ORM 组件(MyBatis、JPA)是必不可少一个环节,而在整合过程,往往要进行大量的配置。...Spring Boot 事务的支持 Spring Boot 开启事务的方式很简单,只需要一个注解 @Transactional 就轻松搞定,此注解可以用在类上,也可以用在方法上。...,如果保存商品 service 出现了异常,不应该保存成功对,那就需要配置 @Transactional 注解。...例行回顾 本文是 Spring Boot 项目集成持久层组件篇的讲解,主要分享了如下部分: Spring Boot 项目如何集成 MyBatis? Spring Boot 项目如何集成 JPA?...从入门到实战》《深入浅出Spring Boot 2.x》 《一步一步学Spring Boot:微服务项目实战(第二版)》 《Spring Boot揭秘:快速构建微服务体系》

    1.9K30

    spring boot通过JPA访问Mysql

    放弃不难,但坚持很酷~ 本文主要介绍spring boot如何使用JPA来访问Mysql,对单表做简单的增删改查操作。...注意:如果通过jpa在数据库建表,将spring.jpa.hibernate,ddl-auto改为create,建完表之后,再改为update,要不然每次重启工程会删除表并新建。...获取表中所有数据的个数 浏览器访问http://localhost:8081/spring-boot-study/novel/count,获取数据个数,如下图所示: ? 插入或更新数据 ?...比如在上述代码示例中所示:在Controller层,需要使用@Autowired来调用Service层;在Service层,需要使用@Autowired来调用DAO层;在DAO层实现类,通过@Autowired...会使用基础注解 源码已上传至https://github.com/841809077/spring-boot-study,欢迎Star。 ----

    2.5K20

    聊聊Spring事务控制策略以及@Transactional失效问题避坑

    好在,JAVA很多项目现在都是基于Spring框架进行构建的。...Spring支持的基于 Spring AOP实现的声明式事务功能,所谓声明式事务,即使用@Transactional注解进行声明标注,告诉Spring框架在什么地方启用数据库事务控制能力。...@Transactional失效场景避坑 同一个类中方法间调用 Spring的事务实现原理是AOP,而AOP的原理是动态代理。...在类内部方法之间相互调用的时候,本质上是类对象自身的调用,而不是使用代理对象去调用,也就不会触发AOP,这样其实Spring也就无法将事务控制的代码逻辑织入到调用代码流程,所以这里的事务控制就无法生效...解决方式,可以建2个不同的类,然后将方法放到两个类,这样跨类调用Spring事务机制就可以生效。

    52320

    Spring Data JPA系列4——Spring声明式数事务处理与多数据源支持

    在第2篇《Spring Data JPA系列2:快速在SpringBoot项目中熟练使用JPA》也知晓了SpringBoot项目快速集成SpringData JPA以及快速上手使用JPA来进行基本的项目开发的技能...在第3篇《Spring Data JPA系列3:JPA项目中核心场景与进阶用法介绍》进一步地聊一下项目使用JPA的一些高阶复杂场景的实践指导,覆盖了主要核心的JPA使用场景。...在类内部方法之间相互调用的时候,本质上是类对象自身的调用,而不是使用代理对象去调用,也就不会触发AOP,这样其实Spring也就无法将事务控制的代码逻辑织入到调用代码流程,所以这里的事务控制就无法生效...所以遇到同一个类多个方法之间相互调用,且调用的方法需要做事务控制的时候需要特别注意下这个问题。解决方式,可以建2个不同的类,然后将方法放到两个类,这样跨类调用Spring事务机制就可以生效。...pom.xml需要引入相关依赖 com.alibaba druid-spring-boot-starter

    91010

    spring 事务机制的个人总结

    ❞ (3)PlatformTransactionManager 集成方式 这里最快的处理方式是构建一个Spring boot web项目进行引入和直接使用,因为在4.2版本之后SpringBoot项目可以不加任何注解添加事务支持...(默认配置),如果不知道如何操作,首先我们在Maven当中引入下面的依赖: ❝可以参考下面的博客快速搭建一个SpringBoot项目Spring Boot快速搭建项目 - 知乎 (zhihu.com...❝小贴士:如果你使用的是springboot2.0之后项目,并且如果在依赖里面有**spring-data-***或者 「spring-tx」事务有关的依赖,则默认会开启声明式事务。...以上支持」,需要「Spring4.2以上支持」,需要「Spring4.2以上支持」,很重要,所以特意强调三遍。...,在spring5.0之后的版本又增加了新的获取方式,比如spring-test有AopTestUtils来获取,下面我们汇总一下这些方法,如果读者感兴趣可以实际验证一遍: 注入“自己”。

    1K10
    领券