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
相关产品推荐
相关产品推荐

