休眠保存对象(一对多关系)外键为空

2022-09-04 02:06:11

我在人类和汽车类之间有一对多的关系。一个人可以拥有许多汽车,反之亦然。我正在使用RESTFUL API来发布数据。我的注释和获取服务工作正常,但每当我尝试插入新数据时,我的邮政服务都会抛出“ 。子表作为 插入。java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL" errorforeign keynull

这是我的代码的一部分。

人.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();
        }

答案 1

此注释:

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="person")

有两个后果:

  1. mappedBy这意味着这是关系的拥有方。这意味着,每当要在 和 之间建立关系时,都需要通过将 Car.person 属性设置为适当的值来执行此操作。对 的更改将被 Hibernate 忽略。CarCarPersonPerson.cars
  2. cascade=CascadeType.ALL意味着每当您保存时,休眠还将对中包含的所有实体调用保存操作PersonPerson.cars

结果:您正在调用一堆未正确设置属性的实体。Session.save()CarCar.person

解决方案:更改关系的所属方(请注意,如果您不希望创建额外的数据库表,则还需要 on),或者遍历并在每个数据库表中正确设置属性。@JoinColumnPerson.carsPerson.carsCar.person

cascade=CascadeType.ALL建议第一个解决方案更适合您的用例。


答案 2