保存数据时抛出java.sql.SQLException: Field 'name'无默认值的问题求助
解决
Field 'name' doesn't have a default value数据库异常的方案 嘿,我刚帮你捋清楚这个问题的来龙去脉,咱们一步步搞定它~
先搞懂异常原因
这个SQL异常说白了就是:你要操作的数据库表中,name字段既没设置默认值,又是非空约束(NOT NULL),但你插入/更新这条数据时,name字段的值是null,数据库不知道该填啥,就报错了。
结合你的代码来看,问题大概率出在关联的Gender对象上:你通过genderServices.getById()获取Gender实例后,把它设置给了Category,但这个Gender对象的name属性是null,导致后续保存时触发了数据库的非空约束校验。
具体排查&修复步骤
1. 先确认查询到的Gender对象是否正常
在代码里加个简单的调试输出(或者用IDE debug),看看拿到的Gender的name是不是真的为空:
Gender gender = genderServices.getById(Integer.parseInt(carMap.get("gender").toString())); // 加这行看看输出 System.out.println("查询到的Gender: ID=" + gender.getId() + ", Name=" + gender.getName()); category.setGender(gender); // ... 其他代码
如果输出里Name是null,那就要检查:
- 数据库中
gender表对应ID的记录,name字段是不是真的空了?如果是,直接在数据库里补全数据就行。 - 你的
getById方法是不是用了投影查询(只查了id没查name)?如果是,修改查询逻辑,确保获取完整的Gender实体。
2. 检查Category类的关联注解是否带了不必要的级联
如果你的Category类里@ManyToOne注解加了级联操作(比如CascadeType.ALL),像这样:
@ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = "gender_id") private Gender gender;
那保存Category的时候,JPA会同步更新关联的Gender对象。如果此时Gender的name是null,就会触发数据库的非空报错。
这种情况直接把级联改成合适的类型(比如只级联更新MERGE),或者去掉级联(因为你是从数据库查的Gender,本来就是持久态,不需要级联操作):
@ManyToOne @JoinColumn(name = "gender_id") private Gender gender;
3. 加个前置校验避免踩坑
为了防止后续再出现类似问题,建议在保存前加个简单的校验逻辑:
String genderIdStr = carMap.get("gender").toString(); Integer genderId = Integer.parseInt(genderIdStr); Gender gender = genderServices.getById(genderId); // 校验Gender是否存在 if (gender == null) { throw new IllegalArgumentException("找不到ID为" + genderId + "的性别记录"); } // 校验name是否为空 if (gender.getName() == null || gender.getName().trim().isEmpty()) { throw new IllegalArgumentException("ID为" + genderId + "的性别记录名称为空,请检查数据"); } category.setGender(gender); category.setCategoryName(carMap.get("categoryName").toString()); this.categoryServices.save(category);
额外小提示
如果实在不想改代码和数据,也可以给数据库gender表的name字段设置默认值(比如空字符串''),但这种方法不推荐,毕竟数据完整性才是关键~
内容的提问来源于stack exchange,提问作者more
相关产品推荐
相关产品推荐

