Spring Boot OneToMany保存时非空属性引用空/瞬时值错误如何解决
报错根因
你的Book实体中category字段对应的@JoinColumn注解设置了nullable = false,要求category_id数据库字段非空,但你提交的POST请求没有传入关联的分类信息,Hibernate持久化时触发非空约束校验失败,抛出该异常。
解决方案
- 方案1:保留图书必须关联分类的业务规则(推荐)
你需要在POST请求体中补充关联分类的信息,根据你使用的接口类型分为两种写法:
- 若使用Spring Data REST自动暴露的接口,直接传入分类资源的URI即可:
{ "name": "programming", "category": "http://localhost:8080/api/v1/categories/1" }
(上述示例中1替换为你实际存在的分类ID)
- 若使用自定义Controller接口,先在业务层查询分类实体再关联保存:
接收请求的DTO示例:
public class BookRequest { private String name; private Long categoryId; // getter、setter省略 }
Service层处理逻辑:
@Transactional public Book createBook(BookRequest request) { // 先查询已存在的分类实体 BookCategory category = bookCategoryRepository.findById(request.getCategoryId()) .orElseThrow(() -> new IllegalArgumentException("指定分类不存在")); Book book = new Book(); book.setName(request.getName()); book.setCategory(category); // 双向关联同步(可选,避免同事务下缓存数据不一致) category.getBook().add(book); return bookRepository.save(book); }
- 方案2:允许图书无分类关联
直接修改Book实体的@JoinColumn配置,移除非空约束:
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="category_id", nullable = true) private BookCategory category;
注意修改后需要同步更新数据库表tbl_book的category_id字段约束,取消非空限制,否则数据库层面仍会报错。
内容的提问来源于stack exchange,提问作者tarif aljnidi
相关产品推荐
相关产品推荐

