JPA保存数据触发PostgreSQL header_id非空约束错误求助
问题解决:PostgreSQL非空约束违反(header_id为空)
错误原因
数据库报错是因为invoice表的header_id字段为非空,但插入时该字段值为null。这是因为JPA双向关联中,关联关系由Invoice的header属性维护(@OneToMany(mappedBy = "header")指定了这一点),如果只在Header的invoices列表中添加发票,却没有给Invoice设置对应的header属性,JPA不会自动填充外键header_id,导致插入失败。
解决步骤
1. 在Header类中添加维护双向关联的方法
在Header实体类里新增一个方法,用于添加发票时同时维护双向关联:
public void addInvoice(Invoice invoice) { this.invoices.add(invoice); invoice.setHeader(this); }
这样每次添加发票时,既能把发票加入列表,又能让发票关联到当前Header,保证双向关系一致。
2. 修正保存逻辑
通过Header级联保存发票(因为配置了cascade = CascadeType.ALL),示例代码:
// 创建Header实例 Header header = new Header(); header.setSubmittedBy("user123"); // 创建Invoice实例 Invoice invoice = new Invoice(); invoice.setSerialNo(1); // 使用addInvoice方法关联两者 header.addInvoice(invoice); // 保存Header,级联保存关联的Invoice headerRepository.save(header);
3. 避免错误写法
- 不要只往
Header的invoices列表加发票,却不设置Invoice的header属性 - 不要单独保存未关联
Header的Invoice实例(除非先设置好header且该Header已持久化)
内容的提问来源于stack exchange,提问作者SmlCodes
相关产品推荐
相关产品推荐

