You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Data JDBC无法保存Car对象的原因是什么?

嘿,我仔细研究了你的代码后找到问题根源啦!

问题出在哪?

Spring Data JDBC的默认逻辑是通过实体的@Id字段值来判断执行插入还是更新:

  • 当@Id为null时,它会认定这是个新实体,执行插入操作;
  • 但如果你手动给@Id赋值(比如你代码里的2L),它会默认认为这个实体已经存在于数据库中,转而执行更新操作——可数据库里根本没有这条记录,所以看起来就像“没插入成功”,其实是更新了个寂寞😅。

两种解决办法任你选

办法一:让数据库自动生成主键(推荐)

修改你的Car实体类,给@Id字段加上主键生成策略注解,交给数据库自动生成ID:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

然后保存的时候不用传ID:

carRepository.save(new Car(null, "BMW", "5"));

办法二:强制执行插入操作

如果你一定要手动指定ID值,可以用JdbcAggregateTemplate的insert方法来明确告诉框架要插入新记录:

// 先注入JdbcAggregateTemplate
@Autowired
private JdbcAggregateTemplate jdbcAggregateTemplate;

// 然后用insert代替save
jdbcAggregateTemplate.insert(new Car(2L, "BMW", "5"));

额外验证小技巧

你可以开启SQL日志,亲眼看看框架实际执行了什么SQL:
在application.properties里加这两行:

logging.level.org.springframework.data.jdbc=DEBUG
logging.level.org.springframework.jdbc.core=DEBUG

这样就能清楚看到是执行了INSERT还是UPDATE,方便你排查问题~

内容的提问来源于stack exchange,提问作者bitmagier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:01:02