Postman提交数据遇ORA-01400:无法向U_ID插入NULL(JPA一对多映射)
问题分析
错误ORA-01400: cannot insert NULL into ("SYSTEM"."USER_DETAIL"."U_ID")明确说明插入USER_DETAIL表时U_ID字段为NULL,而该字段是主键(带非空约束)。结合实体类代码,问题核心是主键字段未配置自动生成策略,且提交数据时未传入u_id有效值。
解决方案
1. 给UserDetails主键配置Oracle序列生成策略
修改UserDetails.java的u_id字段注解,让JPA自动通过Oracle序列生成主键值:
import javax.persistence.Entity; import javax.persistence.Id; import java.util.List; import javax.persistence.*; @Entity @Table(name = "User_Detail") public class UserDetails { @Id @Column(name="user_id") // 绑定Oracle序列生成主键 @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq") @SequenceGenerator(name = "user_seq", sequenceName = "USER_DETAIL_SEQ", allocationSize = 1) int u_id; String u_name; String u_email; int mob_no; String gender; int age; String city; String State; int pincode; String address; String password; @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name="fk_user_id",referencedColumnName = "user_id") private List<Vehicle> vehicle; }
2. 手动创建Oracle序列(若JPA未自动生成)
如果你的JPA配置未开启自动创建数据库对象,需手动在Oracle中执行:
CREATE SEQUENCE USER_DETAIL_SEQ START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE;
3. 若不使用自动生成,确保Postman请求包含u_id
如果需要手动指定主键值,Postman提交的JSON请求体必须包含u_id字段,示例:
{ "u_id": 1001, "u_name": "张三", "u_email": "zhangsan@example.com", "mob_no": 13800138000, "gender": "男", "age": 30, "city": "北京", "State": "北京", "pincode": 100000, "address": "朝阳区XX路", "password": "123456", "vehicle": [ { "vid": 1, "vname": "特斯拉", "vmodel": "Model 3", "showroomprice": "250000", "onroadprice": "260000", "aadharcardno": 123456789012, "pancardno": "ABCDE1234F", "photo": true, "employmenttypes": "全职", "salaryslip": true, "annualsalary": 200000, "existingemi": false } ] }
4. 可选:同步优化Vehicle实体主键
Vehicle的vid字段同样未配置自动生成策略,长期使用易出现同类问题,建议同步修改:
import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.SequenceGenerator; import javax.persistence.Table; @Entity @Table(name="Vehicle_detail") public class Vehicle { @Id @Column(name="vehicle_id") @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "vehicle_seq") @SequenceGenerator(name = "vehicle_seq", sequenceName = "VEHICLE_DETAIL_SEQ", allocationSize = 1) private int vid; private String vname; private String vmodel; private String showroomprice; private String onroadprice; private long aadharcardno; private String pancardno; private boolean photo; private String employmenttypes; private boolean salaryslip; private int annualsalary; private boolean existingemi; }
对应的Oracle序列创建语句:
CREATE SEQUENCE VEHICLE_DETAIL_SEQ START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE;
验证
修改后重启应用,再次通过Postman提交数据,即可解决主键NULL的插入错误。
内容的提问来源于stack exchange,提问作者Rex
相关产品推荐
相关产品推荐

