我在个人课程和汽车课程之间有一对多的关系。一个人可以拥有许多汽车,反之亦然。我正在使用Restful API发布数据。我的注释和Get服务运行正常,但是我的后服务java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL" error在每次尝试插入新数据时都抛出“ 。子表foreign key插入为” null。
java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL" error
foreign key
null
这是我的代码的一部分。
人.java
private List<Car> cars = new ArrayList<Car>(); @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="person") @JsonManagedReference public List<Car> getCars() { return cars; }
汽车.java
private Person person; @ManyToOne @JoinColumn(name = "PERSON_ID", nullable = false, updatable = true, insertable = true) @JsonBackReference public Person getPerson() { return person; }
我的服务等级:
@POST @Path("/PersonRegistration") @Consumes(MediaType.APPLICATION_JSON) public Response postPersonCars(Person person) throws Exception{ Session session = null; ObjectMapper mapper = new ObjectMapper(); //Person per = new Person(); //Car cars = new Car(); try{ session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); //per.setCars(person.getCars()); session.save(person); session.getTransaction().commit(); }catch(Exception e){ e.printStackTrace(); throw e; }finally{ if(null != session){ session.close(); } } return Response.status(201).entity(mapper.writeValueAsString(person)).build(); }
此注释:
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="person")
有两个后果:
mappedBy
Car
Person
Car.person
Person.cars
cascade=CascadeType.ALL
结果:您正在调用Session.save()一堆Car没有Car.person正确设置属性的实体。
Session.save()
解决方案:要么更改关系的所有权(请注意,如果您不想创建额外的数据库表,则还需要@JoinColumn打开Person.cars),或者循环遍历Person.cars并Car.person在每个属性中正确设置属性。
@JoinColumn
cascade=CascadeType.ALL 建议第一个解决方案更适合您的用例。